NetTcpActivator服务(Net.Tcp侦听器适配器)偶尔会停止响应

问题描述 投票:7回答:1

在我当前的项目中,我们(我的意思是“项目团队”)使用IIS上托管的WCF服务。

以下是一些可能很重要的技术细节:

  1. 我们使用NET 3.5进行WCF服务
  2. 我们使用NET.TCP通信协议
  3. 我们使用IIS 7和IIS 7.5来托管这些服务
  4. 我们在每台服务器上使用多个IIS工作进程

所以,问题是 - 有时WCF服务变得不可用。当我们尝试访问这些WCF服务时,我们会收到超时错误。恢复WCF服务功能的唯一方法是重新启动NetTcpActivator(Net.Tcp监听器适配器)Windows服务。

根据我的同事的理论,这个错误可能与这篇知识库文章中描述的问题有关:

FIX:WCF服务的Smsvchost.exe在运行基于.NET Framework 4的WCF服务时停止响应http://support.microsoft.com/kb/2536618

根据这篇文章,SMSvcHost(托管NetTcpActivator和端口共享服务的容器服务)如果无法在60秒内将请求路由到w3wp(IIS工作进程)(非可配置超时),则会挂起。不幸的是,我们无法找到重现此错误的方法。例如,我们将SMSvcHost限制为1个CPU内核和1个线程,并将扩展的挂起连接限制为1M,并在用户模式下将其推送到100%CPU负载。它没有挂!

有时我们的负载测试会导致奇怪的错误,但是当我们停止它们时,所有服务都会自动恢复到正常状态。但有时不会重负载可能会挂起NetTcpActivator!

另外,我想说这不是一个新问题。我的同事已经在3年前得到了它(请参阅此主题以获取更多信息http://forums.iis.net/t/1167668.aspx/1/10)。不幸的是,他们没有得到答案。一些配置更改后问题就消失了!现在它又回到了新的服务器上。

我将非常感谢你的所有想法和想法!

.net wcf iis iis-7 iis-7.5
1个回答
0
投票

好的,经过大量的研究,我找到了问题的原因。可能还有其他情况会发生这种情况,但希望这会对某些人有所帮助。微软正在他们的实验室中进行复制,最终应该有一个修复。

在我们的例子中,所有的行星都必须对齐。我们为客户端和服务器(在开发人员计算机上)提供了一个.NET 4集成应用程序池。该服务使用外部配置文件进行绑定(<bindings configSource="serviceModel.bindings.config" />),该文件从另一个项目链接,并在构建时复制,并将自定义构建任务添加到服务的.csproj中。

要重现此问题:

  1. 停止所有正在运行的SMSvcHost服务(Net.Tcp *,Net.Pipe,Net.Msmq)。由于SMSvcHost进程不会消失,因此重新启动将无法正常工作。
  2. 从Visual Studio中,运行Clean for Wcf Service
  3. 在Windows资源管理器中,删除Wcf服务中的serviceModel.bindings.config
  4. 运行iisreset(摆脱w3wp并启动SMSvcHost服务 - 按F5是服务列表来查看)
  5. 构建Wcf服务(复制链接的配置文件)
  6. 浏览到WcfClient页面,提交两次。如果每次都出现错误,则可能存在问题。在我们的主应用程序中,它在测试应用程序CommunicationObjectFaultedException而不是超时时给出了超时,但两者都没问题。
  7. 停止SMSvcHost服务。如果问题发生,SMSvcHost的事件ID 8将记录到系统事件日志中。

我不知道w3wp或SMSvcHost是否是罪魁祸首。第3步至关重要,但我无法解释原因。如果你不删除文件,那么一切都很好。如果您修改文件(创建的日期保持不变),一切都很好。如果将配置XML移动到主Web.config文件中,一切都很好。当构建任务复制文件时,创建的日期会更新,所以我猜它是以某种方式缓存的,其中一个进程检测到日期更改。

如果你重启SMSvcHost服务(完全停止,完全启动)一次或两次客户端请求将通过,从那时起你就没事了。

所以我现在的猜测是,这可能是一个部署后的问题,但如果你确保一切正在运行(并根据需要重新启动服务)那么你应该没问题。您也可以不执行外部/链接文件。

一旦微软追查这个问题,我希望能有更多的洞察力。

最后更新我忘了早点回到这里。微软基本上承认他们可能有一个错误,但由于有一个解决方法,并且已经花了足够的时间在机票上,他们正在关闭它而不是进一步研究。当SMSvcHost使用以下设置启动时,似乎存在某种类型的竞争条件(类似于我之前发布的内容):

  1. IIS中的主机WCF
  2. 使用非HTTP绑定,以便SMSvcHost发挥作用
  3. 使用外部配置文件使用configSource进行绑定

链接外部配置与它无关。解决方法是不使用我们现在正在做的configSource

© www.soinside.com 2019 - 2024. All rights reserved.