0

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

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

服务器堆栈跟踪:在 System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.OnOpen(TimeSpan timeout) 在 System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) 在 System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan timeout)
在 System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) 在 System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(TimeSpan timeout, CallOnceManager cascade) 在 System.ServiceModel.Channels.ServiceChannel.EnsureOpened(TimeSpan timeout) 在 System. System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) 在 System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) 在 System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)。 ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage 消息)

为了解决这个问题,我不得不将 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 有何关系。我可以做些什么来进一步解决这个问题并使服务更可靠?

4

1 回答 1

1

根据您问题中的信息,很难准确判断您的客户/服务交互中发生了什么,但这里有一些事情可以尝试:

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

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

如果调用仍然有超时,那么您几乎已经消除了不良的 TCP 和客户端配置,您应该关注服务实现的代码性能。

于 2012-11-28T18:05:21.853 回答