大二进制文件(byte [])通过WCF传输文件

| 我正在尝试构建一个WCF服务,该服务允许我将大型二进制文件从客户端发送到该服务。 但是,我只能成功传输最大3-4MB的文件。 (尝试传输4.91MB时,我失败了,当然,超出范围的话) 如果尝试发送4.91MB文件,则会收到以下错误消息: 异常消息:收到对http:// localhost:56198 / Service.svc的HTTP响应时发生错误。这可能是由于服务端点绑定未使用HTTP协议。这也可能是由于服务器终止了HTTP请求上下文(可能是由于服务关闭了)。有关更多详细信息,请参见服务器日志。 内部异常消息:基础连接已关闭:接收时发生意外错误。 内部异常消息:无法从传输连接读取数据:远程主机强行关闭了现有连接。 内部异常消息:远程主机强行关闭了现有连接 将byte []文件作为方法参数发送到公开的服务方法后,就会在客户端发生此错误。 我在服务方法的第一行有一个断点,如果成功进行文件传输(3MB以下),则会遇到断点并传输文件。但是,在这种情况下,一旦调用该方法,就会出现错误。如果发生此错误,则不会在服务中设置断点。 我将粘贴“服务Web.config”和“ Asp页面(客户端)Web.config”的各个部分。如果您还需要发送文件并接受文件的代码,请告诉我,我也将发送该文件。 服务Web.Config
<system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name=\"basicHttpEndpointBinding\" closeTimeout=\"01:01:00\"
      openTimeout=\"01:01:00\" receiveTimeout=\"01:10:00\" sendTimeout=\"01:01:00\"
      allowCookies=\"false\" bypassProxyOnLocal=\"false\" hostNameComparisonMode=\"StrongWildcard\"
      maxBufferSize=\"2147483646\" maxBufferPoolSize=\"2147483646\" maxReceivedMessageSize=\"2147483646\"
      messageEncoding=\"Mtom\" textEncoding=\"utf-8\" transferMode=\"StreamedRequest\"
      useDefaultWebProxy=\"true\">
      <readerQuotas maxDepth=\"2147483646\" maxStringContentLength=\"2147483646\" maxArrayLength=\"2147483646\"
        maxBytesPerRead=\"2147483646\" maxNameTableCharCount=\"2147483646\" />
      <security mode=\"None\">
        <transport clientCredentialType=\"None\" proxyCredentialType=\"None\"
          realm=\"\" />
        <message clientCredentialType=\"UserName\" algorithmSuite=\"Default\" />
      </security>
    </binding>        
  </basicHttpBinding>      
</bindings>
    <services>
        <service behaviorConfiguration=\"DragDrop.Service.ServiceBehavior\" name=\"DragDrop.Service.Service\">
            <endpoint address=\"\" binding=\"basicHttpBinding\" bindingConfiguration=\"basicHttpEndpointBinding\" contract=\"DragDrop.Service.IService\">
                <identity>
                    <dns value=\"localhost\"/>
                </identity>
            </endpoint>
            <endpoint address=\"mex\" binding=\"mexHttpBinding\" contract=\"IMetadataExchange\"/>
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name=\"DragDrop.Service.ServiceBehavior\">
                <serviceMetadata httpGetEnabled=\"true\"/>
                <serviceDebug includeExceptionDetailInFaults=\"false\"/>
      <dataContractSerializer maxItemsInObjectGraph=\"2147483646\"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>
客户端(Asp.net页)Web.Config
<system.serviceModel>
<bindings>
   <basicHttpBinding>
      <binding name=\"BasicHttpBinding_IService\" closeTimeout=\"00:01:00\"
         openTimeout=\"00:01:00\" receiveTimeout=\"00:10:00\" sendTimeout=\"00:01:00\"
         allowCookies=\"false\" bypassProxyOnLocal=\"false\" hostNameComparisonMode=\"StrongWildcard\"
         maxBufferSize=\"2147483646\" maxBufferPoolSize=\"2147483646\" maxReceivedMessageSize=\"2147483646\"
         messageEncoding=\"Mtom\" textEncoding=\"utf-8\" transferMode=\"StreamedResponse\"
         useDefaultWebProxy=\"true\">
         <readerQuotas maxDepth=\"2147483646\" maxStringContentLength=\"2147483646\" maxArrayLength=\"2147483646\"
            maxBytesPerRead=\"2147483646\" maxNameTableCharCount=\"2147483646\" />
         <security mode=\"None\">
            <transport clientCredentialType=\"None\" proxyCredentialType=\"None\"
               realm=\"\">
               <extendedProtectionPolicy policyEnforcement=\"Never\" />
            </transport>
            <message clientCredentialType=\"UserName\" algorithmSuite=\"Default\" />
         </security>
      </binding>
   </basicHttpBinding>
</bindings>

<behaviors>
  <endpointBehaviors>
    <behavior name=\"debuggingBehaviour\">
      <dataContractSerializer maxItemsInObjectGraph=\"2147483646\" />
    </behavior>
  </endpointBehaviors>
</behaviors>

<client>
   <endpoint address=\"http://localhost:56198/Service.svc\" binding=\"basicHttpBinding\"
      bindingConfiguration=\"BasicHttpBinding_IService\" contract=\"ServiceReference.IService\"
      name=\"BasicHttpBinding_IService\" behaviorConfiguration=\"debuggingBehaviour\" />
</client>
</system.serviceModel>
    
已邀请:
(虽然我同意流传输是可取的,但以下内容应使其能够正常工作,而无需进行任何其他更改) 您还需要增加Web.config中的最大消息长度:
<configuration>
  <system.web>
  <httpRuntime maxMessageLength=\"409600\"
    executionTimeoutInSeconds=\"300\"/>
  </system.web>
</configuration>
这会将最大消息长度设置为400 MB(参数以kB为单位)。检查此MSDN页面以获取更多信息。     
如上所述,请尝试使用流传输,这是一些示例代码,显示了使用流传输发送和接收(可能)大量数据。 使用这样的绑定,注意
MaxReceivedMessageSize
TranferMode
设置。
<binding name=\"Streaming_Binding\" maxReceivedMessageSize=\"67108864\"  
    messageEncoding=\"Text\" textEncoding=\"utf-8\" transferMode=\"Streamed\">
</binding>
添加一些服务代码:
[OperationContract]
public Stream GetLargeFile()
{
    return new FileStream(path, FileMode.Open, FileAccess.Read);
}

[OperationContract]
public void SendLargeFile(Stream stream)
{
    // Handle stream here - e.g. save to disk    
    ProcessTheStream(stream);

    // Close the stream when done processing it
    stream.Close();
}
和一些客户端代码:
public Stream GetLargeFile()
{
    var client = /* create proxy here */;
    try
    {
        var response = client.GetLargeFile();

        // All communication is now handled by the stream, 
        // thus we can close the proxy at this point
        client.Close();

        return response;
    }
    catch (Exception)
    {
        client.Abort();
        throw;
    }
}

public void SendLargeFile(string path)
{
    var client = /* create proxy here */;
    client.SendLargeFile(new FileStream(path, FileMode.Open, FileAccess.Read));
}
另外,请确保没有超时,传输大文件可能需要一段时间(不过默认的receiveTimeout是10分钟)。 您可以在此处下载Microsoft WCF / WF示例代码(在撰写本文时,顶部C#链接已断开,但其他示例代码似乎可以)。     
您看过使用Streaming Transfer吗?   Windows Communication Foundation(WCF)   可以使用以下任一方式发送邮件   缓冲或流传输。在里面   默认的缓冲传输模式   消息必须完全传递   接收者可以阅读之前。在   流传输模式,接收方   可以开始处理消息   在完全交付之前。的   当   传递的信息很长   并可以串行处理。   当   消息太大,无法完全删除   缓冲的。 http://msdn.microsoft.com/en-us/library/ms789010.aspx     
我将回应其他人所说的话,并说使用Streaming Transfer是使用Windows Communication Foundation时要走的路。以下是出色的指南,解释了通过WCF流​​式传输文件的所有步骤。它非常全面,非常有用。 它是:通过WCF流​​式传输文件指南。     

要回复问题请先登录注册