【问题标题】:NetTcpActivator service (Net.Tcp Listener Adapter) stops responding occasionallyNetTcpActivator 服务(Net.Tcp 侦听器适配器)偶尔停止响应
【发布时间】:2013-03-03 00:11:29
【问题描述】:

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

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

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

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

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

修复:当您运行基于 .NET Framework 4 的 WCF 服务时,WCF 服务的 Smsvchost.exe 停止响应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)。而且,不幸的是,他们没有得到答案。一些配置更改后问题就消失了!现在它又回到了新服务器上。

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

【问题讨论】:

  • 我已向 Microsoft 提交了一张关于此问题的票。我能够频繁地复制,尽管不可靠。到目前为止,它似乎与您链接到的问题不同,因为已经解决了该问题并且内存转储不同。希望我们能够解决这个问题,我会在这里发布更新。

标签: .net wcf iis iis-7 iis-7.5


【解决方案1】:

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

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

重现问题:

  1. 停止所有正在运行的 SMSvcHost 服务(Net.Tcp*、Net.Pipe、Net.Msmq)。由于 SMSvcHost 进程没有消失,因此无法重新启动。
  2. 在 Visual Studio 中,为 WcfService 运行清理
  3. 从 Windows 资源管理器中,删除 WcfService 中的 serviceModel.bindings.config
  4. 运行 iisreset(摆脱 w3wp 并启动​​ SMSvcHost 服务 -- 按 F5 是服务列表以查看)
  5. 构建 WcfService(复制链接的配置文件)
  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

【讨论】:

  • 我相信你是对的;它被缓存了。清空你的临时目录。由于您在 IIS 中托管 - 我猜它缓存在 Microsoft.NET 文件夹的 .Net 区域中。我在 Web 应用程序中遇到了类似的问题 - 除非我从该文件夹中删除缓存的运行时,否则它似乎将新旧信息放在一起,而我的应用程序将无法运行。我从来没有弄清楚为什么会出现这种行为。就在开发时,我解决了它。我手动删除了旧的第一个,这让我很头疼,但这比尝试解决问题要容易。
猜你喜欢
  • 1970-01-01
  • 2017-11-05
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多