由maxReceivedMessageSize引起的WCF TimeoutException

时间:2012-11-28 16:31:16

标签: wcf wcf-binding nettcpbinding

我们注意到使用netTcpBinding的应用程序突然停止工作。在检查托管服务的服务器上的事件日志之后,我发现了以下警告(许多系列之一):

  

异常信息:       异常类型:TimeoutException       异常消息:打开的操作未在分配的超时00:01:00内完成。分配给此操作的时间可能   是超时的一部分。

     

服务器堆栈跟踪:at   System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.OnOpen(时间跨度   超时)at   System.ServiceModel.Channels.CommunicationObject.Open(时间跨度   超时)at   System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan timeout)
  在System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan   超时)at   System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(时间跨度   超时,CallOnceManager级联)at   System.ServiceModel.Channels.ServiceChannel.EnsureOpened(时间跨度   System.ServiceModel.Channels.ServiceChannel.Call(String。)   action,Boolean oneway,ProxyOperationRuntime操作,Object [] ins,   对象[]出局,TimeSpan超时)at   System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage   methodCall,ProxyOperationRuntime operation)at   System.ServiceModel.Channels.ServiceChannelProxy.Invoke(即时聊天   消息)

要解决这个问题,我必须将maxReceivedMessageSize的大小增加10,所以我的新绑定看起来像这样:

>  <netTcpBinding>
>     <binding name="largeBufferNetTcpBinding" listenBacklog="100" maxBufferSize="519730000" maxConnections="100"
>              maxReceivedMessageSize="519730000" portSharingEnabled="true">
>       <readerQuotas maxArrayLength="519730000"/>
>       <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/>
>       <security>
>         <message clientCredentialType="Windows"/>
>       </security>
>     </binding>
>     <binding name="defaultNetTcpBinding" portSharingEnabled="true"/>
>     <binding name="defaultNetTcpMexBinding" portSharingEnabled="true">
>       <security mode="None"/>
>     </binding>      </netTcpBinding>

我不明白maxReceivedMessageSize是如何与上面显示的TimeoutException相关的。如何进一步排除故障并使服务更可靠?

1 个答案:

答案 0 :(得分:1)

根据您问题中的信息很难确切地说出您的客户/服务互动中发生了什么,但这里有一些尝试:

首先,将您设置为519730000的所有内容更改回除maxReceivedMessageSize之外的默认值,maxReceivedMessageSize应设置为2 - 3 MB范围内的某些内容(从2097152开始并增加,直到该消息大小异常消失)。 / p>

如果不起作用,请保持我建议的相同设置,但在此测试的服务和客户端中将配置更改为basicHttpBinding而不是netTcpBinding。如果此绑定更改有效,则很可能您未正确处置WCF客户端实例(ClientBase或来自ChannelFactory的通道)。 netTcpBinding取决于会话,如果客户端实例未正确处理,则您的代码不会在服务和服务上有效地释放TCP资源。客户。顺便说一句:由于funkiness of the WCF Dispose implementation,将客户端实例包装在using中并不正确。

如果通话仍有超时,那么你几乎已经淘汰了糟糕的TCP&amp;客户端配置,您应该关注服务实现的代码性能。