SignalR在重建后使IIS挂起

时间:2014-11-19 14:12:47

标签: asp.net iis signalr

Windows 8.1。 IIS 8.5。 SignalR版本:

<package id="Microsoft.AspNet.SignalR" version="2.1.2" targetFramework="net451" />
<package id="Microsoft.AspNet.SignalR.Core" version="2.1.2" targetFramework="net451" />
<package id="Microsoft.AspNet.SignalR.JS" version="2.1.2" targetFramework="net451" />
<package id="Microsoft.AspNet.SignalR.SystemWeb" version="2.1.2" targetFramework="net451" />

每当我重建我的项目/解决方案时,IIS都会达到最大CPU使用率,我无法重新加载我的页面。我检查了procmon.exe,它报告了大量(> 20 000 / s)的“RegOpenKey / RegQueryKey”操作,如下所示:

Date & Time:    19.11.2014 10:47:20
Event Class:    Registry
Operation:  RegQueryKey
Result: SUCCESS
Path:   HKLM
TID:    23272
Duration:   0.0000059
Query:  HandleTags
HandleTags: 0x0

Date & Time:    19.11.2014 10:47:20
Event Class:    Registry
Operation:  RegOpenKey
Result: REPARSE
Path:   HKLM\SYSTEM\CurrentControlSet\Services\SignalR\Performance
TID:    23272
Duration:   0.0000121
Desired Access: Read


Date & Time:    19.11.2014 10:47:20
Event Class:    Registry
Operation:  RegOpenKey
Result: NAME NOT FOUND
Path:   HKLM\System\CurrentControlSet\Services\SignalR\Performance
TID:    23272
Duration:   0.0000062
Desired Access: Read

以下是我用来重现此问题的步骤:

  1. 一切正常。
  2. 我写了一些代码并编译
  3. SignalR重新连接WebSocket传输并在响应头中获取此响应:“HTTP / 1.1 101交换协议”
  4. 我做了一个请求,IIS工作进程挂起,再也没有回来或者我等了2-3分钟,事情又恢复了。
  5. 我也在IIS Express中遇到过这种情况。通常我通过杀死IIS工作进程并重新加载来解决此问题。这是权限问题吗?目前,应用程序池在我的本地用户下运行,但我尝试了具有相同结果的应用程序池标识。什么应该在“HKLM \ System \ CurrentControlSet \ Services \ SignalR \ Performance”?目前我的机器上没有这样的注册表项。

2 个答案:

答案 0 :(得分:4)

我以前没见过这种行为。是20,000 / s&#34; RegOpenKey / RegQueryKey&#34;持续2-3分钟的操作?所有这些操作都是否访问&#34; HKLM \ System \ CurrentControlSet \ Services \ SignalR \ Performance&#34;路径?

SignalR旨在在任何性能计数器无法加载后停止进一步加载性能计数器。

或许installing the SignalR performance counters可以解决您的问题。这将创建HKLM \ System \ CurrentControlSet \ Services \ SignalR \ Performance。

您必须确保您的应用程序池在&#34;性能监视器用户&#34;中的用户下运行。基。

答案 1 :(得分:2)

好消息!看来这个问题正式提出并且已经应用​​了修复。如果有人遇到同样的问题,只想分享这个。

https://github.com/SignalR/SignalR/issues/3414

显然,问题是由CultureInfo从其他AppDomain泄露引起的。它发生在PerformanceCounter命名空间中的System.Diagnostics类构造函数中。

请参阅此处的详细分析:http://www.zpqrtbnk.net/posts/appdomains-threads-cultureinfos-and-paracetamol

在撰写本文时,尚未发布新的软件包,但很快就会通过NuGet官方Feed提供修复程序。修复包含在Microsoft.AspNet.SignalR.Core包中。