解决每一点:
1, 2.我认为对于您的方案来说,双工服务是一种矫枉过正。正如您自己所说,当客户端和服务都需要不断地相互通知时,双工服务通常很方便,您正在做什么,将大量数据输入/输出数据库似乎并不是一个使用双工通信的好案例。关于netTcpBinding
不允许双工流式传输,您可以只返回一个字节数组(byte[]
) 而不是流。40 MB 很多,但我认为流式传输不一定会比双工服务有显着的性能提升,后者将返回一个字节数组(由您测试每个设置并比较结果)。所以你在这里有几个选择,不要流式传输并返回一个字节数组(你可以用你的双工服务来做到这一点)或者你可以忘记让你的服务双工,因为对你来说似乎没有一个强有力的案例使其双工并只返回一个Stream:
[OperationContract]
Stream RetrieveFile(long _fileId);
[OperationContract]
long SaveFile(Stream _stream);
3. netTcpBinding
相对于HTTP绑定有相当大的性能优势,但也是有代价的,主要是因为它的TCP端口有时会被internet防火墙阻塞,虽然可以通过netTcpBinding
internet使用,但不推荐。选择绑定取决于您要做什么,如果您的客户端要通过 Internet 使用您的服务,那么netTcpBinding
这不是一个好主意(阻塞的 TCP 端口、防火墙等),但如果您的客户端正在使用该服务在同一个网络(LAN)netTcpBinding
中是最明智的选择。wsDualHttpBinding
(不支持流式传输:@)如果您想坚持双工服务(相当于PollingDuplexHttpBinding
Silverlight 中的)或任何其他基于 HTTP 的绑定(如果您放弃双工服务的想法)是一个不错的选择。
一些可能对您有所帮助的文章,各种 WCF 绑定的性能比较:
http://blog.shutupandcode.net/?p=1085
http://tomasz.janczuk.org/2010/03/comparison-of-http-polling-duplex-and.html
根据作者的说法,关于通过 HTTP 使用 WCF 流式传输大数据,这两个样本都经过了高达 2GB 的数据测试:
http://garfoot.com/blog/2008/06/transferring-large-files-using-wcf/
http://www.codeproject.com/Articles/166763/WCF-Streaming-Upload-Download-Files-Over-HTTP
您不应该认为您必须使用netTcpBinding
或必须为您的服务使用 Streamed 传输,netTcpBinding
只有在启用限制和配置某些套接字级别属性后才会变得比 HTTP 绑定更高效。与缓冲传输相比,流式传输 40 MB 不会有显着的性能提升。所以你有很多选择和很多权衡。没有黑白和对错之分,关键在于您如何定制服务以最好地满足您的需求,大多数解决方案都会奏效。你的场景是一个非常常见的场景,网上有很多关于 WCF 中大数据传输的东西,做更多的研究;)