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

我正在尝试构建一个WCF服务,允许我从客户端向服务发送大型二进制文件。

但是我只能成功传输高达3-4MB的文件。 (当我尝试转移4.91MB时,我失败了,当然,除了之外)

如果我尝试发送4.91MB文件,我得到的错误是:

exception消息:接收到http:// localhost:56198 / Service.svc的HTTP响应时发生错误。 这可能是由于服务端点绑定不使用HTTP协议。 这也可能是由于服务器中止HTTP请求上下文(可能是由于服务关闭)。 请参阅服务器日志以获取更多详

内部exception消息:基础连接已关闭:接收上发生意外错误。

内部exception消息:无法从传输连接读取数据:远程主机强制关闭现有连接。

内部exception消息:远程主机强制关闭现有连接

只要将byte []文件作为方法参数发送到公开的服务方法,就会在客户端发生此错误。

我在服务方法的第一行有一个断点,如果文件传输成功(低于3MB),则会触发断点并传输文件。 但是在这种情况下,只要调用该方法,就会出现错误。 如果出现此错误,则不会触发服务中的断点。

我将粘贴我的Service Web.config和Asp Page(Client)Web.config的各个部分。 如果您还需要发送文件并接受文件的代码,请告诉我,我也会发送。

服务Web.Config

                                

客户端(Asp.net页面)Web.Config

                          

(虽然我同意流媒体转移是可取的,但下面应该让它在没有任何其他变化的情况下工作)

您还需要增加Web.config中的最大消息长度:

      

这会将最大消息长度设置为400 MB(参数以kB为单位)。 有关更多信息,请查看此MSDN页面 。

正如所指出的,尝试使用Streaming Transfer ,这里有一些示例代码,显示使用流传输发送和接收(可能)大量数据。

使用这样的绑定 ,请注意MaxReceivedMessageSizeTranferMode设置。

   

添加一些服务代码

 [OperationContract] public Stream GetLargeFile() { return new FileStream(path, FileMode.Open, FileAccess.Read); } [OperationContract] public void SendLargeFile(Stream stream) { // Handle stream here - eg 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

我会回应其他人的说法,并说使用流式传输是使用Windows Communication Foundation时的方法。 下面是一个很好的指南,解释了通过WCF流​​式传输文件的所有步骤。 它非常全面,信息量很大。

这是: 通过WCF流​​式传输文件的指南 。