再会!
引用《Programming WCF Services》作者 Juval Lowy 一书的话:
默认情况下,当客户端和服务交换消息时,这些消息会在接收端进行缓冲,只有在整个消息接收完毕后才会传递。无论是客户端向服务发送消息还是服务向客户端返回消息都是如此。因此,当客户端调用服务时,只有在客户端的消息全部收到后才会调用服务;同样,只有在完整接收到带有调用结果的返回消息后,客户端才会解除阻塞。对于足够小的消息,这种交换模式提供了一个简单的编程模型,因为与消息处理本身相比,接收消息引起的延迟通常可以忽略不计。然而,当涉及到更大的消息(例如涉及多媒体内容、大文件或批量数据的消息)时,在收到整条消息之前进行阻止可能是不切实际的。为了处理这种情况,WCF 允许接收方(无论是客户端还是服务)在通道仍在接收消息时开始处理消息中的数据。这种类型的处理称为流传输模式。对于大负载,流式传输提供了改进的吞吐量和响应能力,因为在发送或接收消息时,接收方和发送方都不会被阻塞 WCF 使接收方(无论是客户端还是服务)能够在通道仍在接收消息时开始处理消息中的数据。这种类型的处理称为流传输模式。对于大负载,流式传输提供了改进的吞吐量和响应能力,因为在发送或接收消息时,接收方和发送方都不会被阻塞 WCF 使接收方(无论是客户端还是服务)能够在通道仍在接收消息时开始处理消息中的数据。这种类型的处理称为流传输模式。对于大负载,流式传输提供了改进的吞吐量和响应能力,因为在发送或接收消息时,接收方和发送方都不会被阻塞
对于传输文件,我建议使用带有异步模式的 Stream。
[ServiceContract(SessionMode = SessionMode.NotAllowed)]
public interface ITerrasoftFiles
{
[OperationContract(AsyncPattern = true)]
IAsyncResult BeginGetFiles(Guid ID, AsyncCallback asyncCallBack, object asyncState);
Stream EndGetFiles(IAsyncResult res);
[OperationContract]
FileInfo GetFileInfo(Guid ID);
}
并在 Web.config 中设置transferMode="StreamedResponse"
<bindings>
<netTcpBinding>
<binding name="tcpTerrasoftFiles" transferMode="StreamedResponse">
<security mode="None" />
</binding>
</netTcpBinding>
</bindings>
<services>
<service name="TWebServices.Services.TerrasoftFiles">
<endpoint address=""
binding="netTcpBinding" bindingConfiguration="tcpTerrasoftFiles"
contract="TWebServices.Services.ITerrasoftFiles" />
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
</service>
</services>