【问题标题】:Upload image as stream with other parameters WCF使用其他参数 WCF 将图像作为流上传
【发布时间】:2014-01-05 18:13:30
【问题描述】:

我正在尝试通过 WCF 将图像保存在数据库中。这是我的代码。

public void saveImage(Stream stream, string size)
    {
        //int intsize = Convert.ToInt32(size);
        byte[] buffer = new byte[10000];
        int bytesRead, totalBytesRead = 0;
        string encodedData = "";

        do
        {
            bytesRead = stream.Read(buffer, 0, buffer.Length);
            encodedData = encodedData + Convert.ToBase64String(buffer,
                                       Base64FormattingOptions.InsertLineBreaks);
            totalBytesRead += bytesRead;
        } while (bytesRead > 0);

这就是合同。

    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "SaveImage/{size}")]
    void saveImage(Stream stream, string size);

最后这是我的配置文件的一部分

<system.serviceModel>
<services>
  <service behaviorConfiguration="RestServiceBehavior" name="ABBStreamService.ABBConnectStreamWCF">
    <endpoint address="" behaviorConfiguration="web" binding="webHttpBinding" bindingConfiguration="webHttpBinding" contract="ABBStreamService.IABBConnectStreamWCF" />
  </service>
</services>
<bindings>
  <webHttpBinding>
    <binding name="webHttpBinding" transferMode="Streamed" maxReceivedMessageSize="2147483647" maxBufferSize="10485760" closeTimeout="00:01:00" openTimeout="00:01:00"
             receiveTimeout="00:10:00" sendTimeout="00:01:00">
      <readerQuotas maxStringContentLength="2147483647" maxArrayLength="1000000" />
    </binding>
  </webHttpBinding>
</bindings>
<behaviors>
  <serviceBehaviors>
    <behavior name="RestServiceBehavior">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="web">
      <webHttp />
    </behavior>
  </endpointBehaviors>
</behaviors>
<protocolMapping>
    <add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>    
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>

当我尝试仅使用 Stream 作为参数运行服务时,它可以工作。但是当我尝试添加另一个参数时它失败了。

【问题讨论】:

  • 失败怎么办?错误是什么,参数是什么?
  • 抱歉,我的描述可能不完整。当 saveImage 方法只有 Stream 作为参数时,我的服务正在工作。我收到此错误“由于内部错误,服务器无法处理请求。”
  • 该错误被提供给客户端以隐藏可能存在安全风险的真正错误。如果您调试服务(使用日志记录或调试),您应该会发现实际错误。也看看 InnerException 的
  • 流式操作中不能有多个参数。 “流式传输中发生的操作最多可以与一个输入或输出参数签订合同。” (msdn.microsoft.com/en-us/library/ms731913%28v=vs.110%29.aspx)
  • 这篇文章应该可以帮到你:codeproject.com/Articles/166763/…

标签: c# wcf rest


【解决方案1】:

您可以在请求中添加一个标头,然后在服务中读取它。

 //Javascript to set the header
 var xhr = new XMLHttpRequest();
 var image = document.getElementById("yourFileInput").files[0];
 xhr.setRequestHeader('size', image.size);

 //C# in your service method to read the size header
 IncomingWebRequestContext request = WebOperationContext.Current.IncomingRequest;
 var headers = request.Headers;
 string size = headers["size"];

【讨论】:

    【解决方案2】:

    我知道我迟到了,但这对搜索者很有用。 在正文中发送您的文件,在请求的标头中发送其余参数。

    以下示例代码已在 Post man 中进行了测试,并且工作起来非常棒。

    你的界面

    [WebInvoke(
            Method = "POST",
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "PostImage")]
            void PostImage(Stream stream);
    

    .svc 方法:

    public void PostImage(Stream stream)  
            {
                // get image from stream and implement your logic
    
                var headers = OperationContext.Current.IncomingMessageProperties["httpRequest"];
                // other parameters will be accessible here e.g image name etc
                var imgname = ((HttpRequestMessageProperty)headers).Headers["imgname"];
    
    
            }
    

    参考请见this链接

    【讨论】:

      猜你喜欢
      • 2023-03-22
      • 1970-01-01
      • 2017-05-24
      • 2019-08-24
      • 2014-11-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-19
      • 2011-05-31
      相关资源
      最近更新 更多