首先,抱歉,我不会流利。
我正在试图找出为什么我们的WCF服务在我们拥有高通话/秒速率的环境时停止工作。我不确定只是增加超时会解决问题。
我们有2个网络服务:
两个webservices都具有最低配置:无身份验证,无trasaction,无需特殊处理消息..检查绑定:
<netTcpBinding>
<binding transactionFlow="false">
<security mode="None">
<message clientCredentialType="None" />
<transport clientCredentialType="None"></transport>
</security>
<reliableSession enabled="false"/>
</binding>
</netTcpBinding>
我们正在尝试使用Net.Tcp绑定,因为它的可行性和速度。
事实1 - Net.Tcp绑定是主要原因
当负载很高时,通道Net.Tcp停止工作。而已!但BasicHttp仍然像一个魅力。
WindowsService:频道net.tcp持续了几分钟(3m - 10m)然后才开始工作(BY ITSELF,我们没有改变任何东西。 Goblins正在努力)。
AppFabric / IIS / WAS:频道net.tcp保持不变。需要手动重启。
BasicHttpBinding配置类似于net.tcp:没有任何消息处理,没有安全问题或类似的事情。
FACT 2 - 没有任何记录
我们找不到任何善意,小费,技巧来弄清楚发生了什么。我试过转储内存,事件日志,System.Diagnostics并没有任何相关性。最相关的提示是SMSvcHost 4.0.0.0中的错误:
调度重复的套接字时发生错误:此句柄 现在已经泄露了。 ID:2272来源: System.ServiceModel.Activation.TcpWorkerProcess / 62875109异常: System.TimeoutException:此请求操作发送到 http://schemas.microsoft.com/2005/12/ServiceModel/Addressing/Anonymous 在配置的超时(00:01:00)内没有收到回复。该 分配给此操作的时间可能是更长时间的一部分 超时。这可能是因为该服务仍在处理中 操作或因为服务无法发送回复消息。 请考虑增加操作超时(通过强制转换 通道/代理到IContextChannel并设置OperationTimeout property)并确保该服务能够连接到 客户端。
服务器堆栈跟踪:at System.Runtime.AsyncResult.End [TAsyncResult](IAsyncResult结果)
在 System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.End(SendAsyncResult 结果)在 System.ServiceModel.Channels.ServiceChannel.EndCall(String action, 对象[]出,IAsyncResult结果)at System.ServiceModel.Channels.ServiceChannelProxy.InvokeEndService(IMethodCallMessage methodCall,ProxyOperationRuntime operation)at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(即时聊天 消息)在[0]处重新抛出异常:at System.Runtime.AsyncResult.End [TAsyncResult](IAsyncResult结果)
在 System.ServiceModel.Activation.WorkerProcess.EndDispatchSession(IAsyncResult的 结果)进程名称:SMSvcHost进程ID:1532
您是否有任何提示或配置技巧可以帮助我解决此问题?
高负载情况下的最佳配置是什么?
答案 0 :(得分:3)
如果您在Visual Studio或svcutil工具中生成了服务引用,请确保始终调用代理的Close或Abort方法。我几天前遇到了类似的问题,因为我忘了称这些方法。
答案 1 :(得分:0)
如果您要相应地调用Close()和Abort()方法,但仍然收到此错误,请考虑以下情形:
您运行基于Microsoft .NET Framework 3.0或基于.NET Framework 3.5的Windows Communication Foundation(WCF)服务。
WCF服务使用Net.Tcp端口共享服务(Smsvchost.exe),并托管在运行Internet信息服务(IIS)的计算机上。
满足以下条件之一:
在这种情况下,WCF服务需要超过一分钟的时间来处理来自客户端应用程序的请求。此外,在事件日志中会记录一条组合以下事件条目的错误消息:
日志名称:系统
来源:SMSvcHost 3.0.0.0
日期:
事件ID:8
任务类别:共享服务
级别:错误
关键字:经典
用户:本地服务
计算机:
说明:分派重复的套接字时发生错误:此句柄现在在进程中泄漏。
ID:2620
来源:System.ServiceModel.Activation.TcpWorkerProcess
例外:
System.TimeoutException:发送到此请求的请求操作在配置的超时(00:01:00)内未收到答复。分配给该操作的时间可能是较长超时的一部分。这可能是因为该服务仍在处理该操作,或者是因为该服务无法发送回复消息。请考虑增加操作超时(通过将通道/代理转换为IContextChannel并设置OperationTimeout属性),并确保该服务能够连接到客户端。
注意:,您必须重新启动IIS,才能从此问题中恢复WCF服务。
原因:
发生此问题的原因是,当Smsvchost.exe进程尝试将传入的连接请求传输到W3wp.exe工作进程时,在一分钟后超时。 此外,此超时不可配置。
当CPU负担很重时,或者当传入许多并发连接请求时,Smsvchost.exe进程无法在一分钟内将传入的连接转移到W3wp.exe工作进程。因此,Smsvchost.exe进程超时并最终停止响应。发生此问题时,除非重新启动IIS,否则Smsvchost.exe进程无法将以后的请求路由到W3wp.exe工作进程。
解决方案:
Microsoft建议应用Microsoft知识库(KB)文章中介绍的热修复2504602。此热修复程序可用于.NET Framework 3.0 SP2,.NET Framework 3.5 SP1和.NET Framework 4中的WCF。
此外,Microsoft声称已在.Net Framework 4.5中解决了此问题,因此,您应该升级到最新版本。
如果您升级到.Net Framework 4.5,并且问题仍然存在,则解决方法是修改smsvchost.exe.config文件以增加超时和挂起的接受以及其他各种参数。