调试SignalR挂起

时间:2014-07-10 05:03:57

标签: iis signalr

Windows 7,SignalR2。

我有一些HelloWorld SignalR代码可以在一个VS2013项目中运行(即我的SignalR hello world playground)。

当我将相同的代码添加到现有应用程序时,SignalR线程"挂起"在IIS"永远"。这种情况每次都会发生。

我的SignalR控制台如下:

SignalR console

我的perfMon计数器看起来像这样:

PerfMon

我的工作进程列表如下所示:

Worker Process List

关于从哪里开始调试的一些提示后我来了。在Java中,我会采用线程转储,我可以很容易地看到发生了什么。

当作为调试器连接时,这些线程在VS2013中不可见。

IIS / DotNet中似乎没有等效的内容?

这是我的中心:

 public class Ep1DataImportHub : Hub
{
     public int recordsToBeProcessed = 100000;

        public void DoLongOperation()
        {
            for (int record = 0; record <= recordsToBeProcessed; record++)
            {
                if (ShouldNotifyClient(record))
                {
                    Clients.Caller.sendMessage(string.Format
                    ("Processing item {0} of {1}", record, recordsToBeProcessed));
                    Thread.Sleep(10);
                }
            }
        }

        private static bool ShouldNotifyClient(int record)
        {
            return record % 10 == 0;
        }
    }  

这是我的客户端,被截断为最简单的悬挂方案。

$(function () {


    // Initialize the connection to the server
    var realtimeNotifier = $.connection.ep1DataImportHub;
    $.connection.hub.logging = true;
    $.connection.hub.start();
})

有很多关于带有SignalR 1的IIS中的SignalR挂起,但我使用的是SignalR 2.

有人可以告诉我如何开始调试正在进行的操作。这个工具看起来很有趣,但我不知道它是什么https://github.com/SignalR/SignalR/issues/1335https://github.com/SignalR/SignalR/issues/1335

以下是其中一个卡住线程的托管调用堆栈

System_Web_ni!DomainNeutralILStubClass.IL_STUB_PInvoke(IntPtr, Boolean, Boolean ByRef)+8f 
[[InlinedCallFrame] (System.Web.Hosting.UnsafeIISMethods.MgdExplicitFlush)] System.Web.Hosting.UnsafeIISMethods.MgdExplicitFlush(IntPtr, Boolean, BooleanByRef) 
System_Web_ni!System.Web.Hosting.IIS7WorkerRequest.ExplicitFlush()+20 
System_Web_ni!System.Web.HttpResponse.Flush(Boolean, Boolean)+c3 
System_Web_ni!System.Web.HttpWriter.WriteFromStream(Byte[], Int32, Int32)+a0 
Microsoft.Owin.Host.SystemWeb.CallStreams.DelegatingStream.Write(Byte[], Int32, Int32)+3a 
Microsoft.Owin.Host.SystemWeb.CallStreams.OutputStream.Write(Byte[], Int32, Int32)+3b 
Microsoft.AspNet.SignalR.Owin.ServerResponse.Write(System.ArraySegment`1)+24 
Microsoft.AspNet.SignalR.Hosting.ResponseExtensions.End(Microsoft.AspNet.SignalR.Hosting.IResponse, System.String)+c8 
Microsoft.AspNet.SignalR.PersistentConnection+d__f.MoveNext()+180 
mscorlib_ni!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)+285 
mscorlib_ni!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)+9 
mscorlib_ni!System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner.Run()+a4 
System_Web_ni!System.Web.Util.SynchronizationHelper.SafeWrapCallback(System.Action)+b4 
mscorlib_ni!System.Threading.Tasks.Task.Execute()+6e 
mscorlib_ni!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)+285 
mscorlib_ni!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)+9 
mscorlib_ni!System.Threading.Tasks.Task.ExecuteWithThreadLocal(System.Threading.Tasks.Task ByRef)+250 
mscorlib_ni!System.Threading.Tasks.Task.ExecuteEntry(Boolean)+85 
mscorlib_ni!System.Threading.ThreadPoolWorkQueue.Dispatch()+1ea 
[[DebuggerU2MCatchHandlerFrame]] 
[[ContextTransitionFrame]] 
[[DebuggerU2MCatchHandlerFrame]] 

2 个答案:

答案 0 :(得分:4)

您是否碰巧定义了Application_PreSendRequestHeaders方法,或者您是否以其他方式附加到HttpApplication.PreSendRequestHeaders事件?

我问,因为这似乎与报告here的问题相同。对于该线程中的至少一些人,删除PreSendRequestHeaders事件处理程序解决了该问题。

虽然我们recommend you never use the PreSendRequestHeaders event,但我们积极working on this issue,因此我们可以为2.1.1修复此问题。


如果您没有附加PreSendRequestHeaders事件,我们(SignalR团队)可以使用您的帮助。到目前为止,我们无法在不附加PreSendRequestHeaders事件的情况下重现此问题。如果您可以向我们提供不附加到此活动的应用程序,但仍然以这种方式挂起,我们将非常感激。

SignalR(2.0.3)的早期版本没有向/ signalr / start发出请求,也没有遇到此挂起。因此,您可以暂时解决此问题,方法是将SignalR 2.1.0降级到2.0.3,直到2.1.1发布。

答案 1 :(得分:1)

我们将此问题追溯到Glimpse.ASPNet。它将自己附加到PreSendRequestHeaders。因此,如果您将Glimpse.ASPNet与SignalR一起使用,您可能会发现线程会“永远”锁定。

删除Glimpse.AspNet修复了问题