2011-08-01 34 views
0

我继承了这个由客户端和服务器代码组成的巨大应用程序,并且我试图将部分通信的传输模式更改为“流式传输”,以避开真正浪费的内存消耗发生在缓冲模式下,并使我的客户抛出OOM异常,另请参阅this answer当TransferMode = Streamed时出现TimeoutException

的代码是这样的:

GZipMessageEncodingBindingElement gElement = new GZipMessageEncodingBindingElement(); 

HttpsTransportBindingElement hElement = new HttpsTransportBindingElement(); 
hElement.TransferMode = TransferMode.Streamed; 
hElement.MaxBufferSize = int.MaxValue; 
hElement.MaxBufferPoolSize = int.MaxValue; 
hElement.MaxReceivedMessageSize = int.MaxValue; 

CustomBinding binding = new CustomBinding(); 
binding.SendTimeout = new TimeSpan(0, 0, 60); 
binding.Elements.Add(gElement); 
binding.Elements.Add(hElement); 

EndpointAddress address = new EndpointAddress(uri); 

return new ChannelFactory<T>(binding, address).CreateChannel(); 

而例外的是,建议我增加的SendTimeout(目前设置为1分钟)一个TimeoutException。

更新:不过,也有2个服务的transferMode设置为流传后仍能正常工作,其实我证实,他们用gzip/HTTPS通过GZIPMessageEncoder.ReadMessage设置断点(流,...)。因此,对于ReadMessage内部的两个服务而言,对于一个服务它不会。据我所知,服务的配置是相同的,涉及到ConcurrencyMode和InstanceContextMode。

更新2:配置后只有一个服务看起来并不像Streamed那样工作,而是将其他两个服务缓存起来,这部分工作。所以不是这样的服务不好,也许有些连接阻碍了流模式下的其他连接,使它们超时。

如果我只删除'TransferMode'这一行,一切都很好,并且测试服务器永远不需要超过一秒钟的时间来响应,所以增加SendTimeout不会导致任何地方。

对于这个测试,我只改变了客户端的顺序,至于我的理解,这个设置不应该影响客户端和服务器的通信方式,只是应用程序使用“流”设置来处理数据。

请容易对我来说,我是一个完整的WCF newb,虽然我在MSDN页面上看到了关于流式传输模式的一些警告,但是在我的代码/配置中grep的指针是真的有帮助的,否则它只是巨大的,许多服务,每一个都有不同的运输设置等。

谢谢!

回答

相关问题