【问题标题】:WCF TimeoutException caused by maxReceivedMessageSize由 maxReceivedMessageSize 引起的 WCF TimeoutException
【发布时间】:2012-11-28 16:31:15
【问题描述】:

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

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

服务器堆栈跟踪:在 System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.OnOpen(时间跨度 超时)在 System.ServiceModel.Channels.CommunicationObject.Open(时间跨度 超时)在 System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan 超时)
在 System.ServiceModel.Channels.CommunicationObject.Open(时间跨度 超时)在 System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(时间跨度 超时,CallOnceManager 级联)在 System.ServiceModel.Channels.ServiceChannel.EnsureOpened(时间跨度 超时)在 System.ServiceModel.Channels.ServiceChannel.Call(字符串 action, Boolean oneway, ProxyOperationRuntime 操作, Object[] ins, Object[] 出局,TimeSpan 超时)在 System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall,ProxyOperationRuntime 操作)在 System.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 有何关系。我可以做些什么来进一步解决这个问题并使服务更可靠?

【问题讨论】:

  • 就个人而言,我看不出它们是如何链接的,除非您的网络非常慢。您的代码中有任何可以使用的方法跟踪吗?
  • 我们的服务中有跟踪,但它甚至没有到达那里,因为 WCF/.NET 正在引发错误。

标签: wcf wcf-binding nettcpbinding


【解决方案1】:

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

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

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

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

【讨论】:

  • 我深入研究了代码,发现我们在一种方法中在代理周围使用“using{}”语句,而另一种方法根本没有尝试“关闭”代理。我希望这是问题所在。我使用 try/catch/abort 范例修改了方法,并将进行更多测试。
  • 太棒了!我发现使用netTcpBinding 会强制您的客户端/服务资源管理代码非常干净,因为否则您会遇到像您这样的问题,有点像布丁的证明。我添加了一个指向讨论 WCF Disposable 问题的帖子的链接。抱歉,我最初没有添加它,我有一个会议要参加。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-13
  • 2023-03-22
  • 2011-07-22
  • 2013-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多