2014-07-10 53 views
2

Windows 7,SignalR2。調試SignalR hang

我有一些HelloWorld SignalR代碼在一個VS2013項目中工作(即,我的SignalR hello world playground)。

當我將相同的代碼添加到現有應用程序時,SignalR線程在IIS中「掛起」「永遠」。每一次都會發生這種情況。

我SignalR控制檯看起來像:

SignalR console

我的性能計數器是這樣的:

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在IIS掛着SignalR 1,但我使用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]] 

回答

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發佈。

+0

我們沒有直接使用「Application.PreSendRequestHeaders」我們使用的一些插件,如一瞥,RoutedebugHandler,沒戲,等我會試着得到一個簡單的回購程序今天在一起,並得到它。 – Dave

+0

在SignalR 2.2.0/signalr/start上隨機掛起。我不知道如何調試。 –

1

我們將這個問題追溯到Glimpse.ASPNet。它附加到PreSendRequestHeaders。因此,如果您使用帶有SignalR的Glimpse.ASPNet,則可能會發現您的線程「永久」鎖定。

刪除Glimpse.AspNet解決問題