2017-04-11 19 views
0

私はSignalRでもっとも異常な動作を経験しています。いくつかのリファクタリングの後、私は接続に関する問題に遭遇しました。私はコードが推奨された方法に従わなかったので、それが以前に働いたのは純粋な運だと思う。たとえば、クライアントが明示的にそれらのハブにサブスクライブしないようにハブメソッドを宣言する前に、ハブを開始しました。私は一日中、なぜ、どのように運がないのかを見てきました。SignalRが「開始要求の開始」でフリーズします

function initSignalR() { 
    var me = this, 
    appointmentHub = $.connection.appointmentHub, 
    assignmentHub = $.connection.assignmentHub, 
    taskHub = $.connection.taskHub,  
    notificationHub = $.connection.notificationHub, 
    messageHub = $.connection.messageHub; 

    $.connection.hub.connectionSlow(onConnectionSlow); 
    $.connection.hub.stateChanged(onStateChanged); 
    $.connection.hub.error(onError); 
    $.connection.hub.disconnected(onDisconnected); 
    $.connection.hub.logging = true; 

    appointmentHub.client.updateAppointment = onUpdateAppointment;  
    $.connection.hub.start().done(onDone).fail(onFailed); 
    ... code ommitted for brevity ... 
} 

function onUpdatedAppointment(appointment) { 
.... code ommitted for brevity .... 
} 

これらは、それが時折働くとき、コンソールに表示されるログです:

Client subscribed to hub 'appointmenthub' Negotiating with '/signalr/negotiate?clientProtocol=1.5&connectionData=%5B%7B%22name%22%3A%22appointmenthub%22%7D%5D' webSockets transport starting. Connecting to websocket endpoint 'ws://localhost:52541/signalr/connect?.... Websocket opened. webSockets transport connected. Initiating start request. The start request succeeded. Transitioning to the connected state. Now monitoring keep alive with a warning timeout of 13333.333333333332, keep alive timeout of 20000 and disconnecting timeout of 30000

私は、これは、文書がロードされると実行されるコードでリファクタリング後

「時々」という目的を書いていました。残念ながら、ほとんどの場合、私はそれほど遠くには行きません。通常、コンソールの最後の目に見えるステップがある:接続

WebSocketを輸送。開始要求を開始します。私はそれは私が空の機能を持っていたが、でもそれが原因ではないとき、私はより多くを接続することができ、問題の原因となったコールバックメソッドの本体だと思ったいくつかの時間のために

。だから私は次に何をすべきか考えがなくなっている。完全を期すために

が、ここではスタートアップコードはASP.NET MVCである:

GlobalHost.Configuration.TransportConnectTimeout = TimeSpan.FromSeconds(50); 
GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromSeconds(110); 

GlobalHost.HubPipeline.AddModule(new ErrorHandlingPipelineModule());  
GlobalHost.DependencyResolver.Register(typeof(IJavaScriptMinifier),() => new SignalRMinifier()); 
GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider),() => new UserIdProvider()); 

HubConfiguration hubConfiguration = new HubConfiguration() 
{     
    EnableDetailedErrors = true, 
}; 

return app.MapSignalR(hubConfiguration); 

私はsimilar issueを見つけましたが、何の解決策はありませんされています。

IE/Edge/Chrome/Firefox/Operaでこれをテストしたところ、すべて同じ結果になりました。アプリケーションはASP.NET MVC5上で実行されており、最新バージョンのSignalR(2.2.1)が使用されています。

答えて

1

このように、クライアントサイドコードやSignalRの設定に問題はありませんでしたが、問題はHubクラスに位置していました。

タイムアウトやエラー(外部サービスとデータベースへの接続)が発生したOnConnectedメソッドにカスタムコードがありました。作業を別のプロセス(例:HangfireまたはNServiceBusを使用)に送信することで、前述のように問題を解決できました。

説明されている動作は完全に意味があります。私がここで学んだことは、ASP.NET MVCのコントローラーのようなハブを扱うことです。それらは無脂肪でなければならず、限られたビジネスロジックを含むべきです。

関連する問題