2013-07-23 9 views
9

SignalR(jquery.signalR-2.0.0-beta2.js)に基づくリアルタイムメッセージングシステムを使用してasp.net mvcアプリケーションを開発します。問題は、SignalR接続の開始後にすべての部分ビューをロードできないことです。この場合は、 $ .connection.hub.start({transport: 'longPolling'})。done(function(){ applicationHub.server.connectUser(); }}の後にあるすべてのAjaxリクエストは保留状態のままです。この要求を非同期にするか、SignalRのバグですか?ご協力いただきありがとうございます!SignalR connection freeze他のajaxリクエスト

SignalRコール:部分的なビューをレンダリング

<script type="text/javascript"> 

    $(document).ajaxStop(function() { 
     var applicationHub = $.connection.applicationHub; 

     if ($.connection.hub && $.connection.hub.state == $.signalR.connectionState.disconnected) { 

      registerConversationClientMethods(applicationHub); 

      $.connection.hub.start({ transport: 'longPolling'}).done(function() { 
       applicationHub.server.connectUser(); 
      }) 
      .fail(function() { 

      }); 
     } 
    }); 
</script> 

Ajax呼び出し:

関数LoadActivities(ID、種類、容器、アクション、loaderpath){

var url = action + '/?id=' + id + '&type=' + type; 
var targetDiv = container; 
var ajaxLoading = "<img id='ajax-loader' src='" + loaderpath + "' height='6' width='50' style='margin:5px;'>"; 

$(targetDiv).html("<div align='center'>" + ajaxLoading + "</div>"); 

$.get(url, null, function (result) { 
    $(targetDiv).html(result); 
}); 

}

+0

あなたがiOS版を使用しています?これは問題ですか? https://github.com/SignalR/SignalR/issues/1406 –

+0

いいえ私はWindows 7を使用しています。あなたの問題は同様の動作をしていますが、私が理解しているものではありません。すべての非同期ajaxリクエストは、シグナル状態のajaxリクエスト(poll?transport = longPolling&connectionToken = 1Kpx%2B72 ...)が開始された後も保留状態に留まります。 – Alliancer

+0

Windows 7 +完全IIS(iis expressではない)の同時接続数は10です。完全iisを使用していますか? – davidfowl

答えて

1

@ bjornholの答えをもう少し取ってください - すべてのSignalRリクエスト(AJAXをロードしていたもの)の同じ問題が私にも起こっていました。私はそれが問題だったjQueryだと思っていましたが、実際にはセッション状態です。そのコントローラの場合、SessionStateBehaviourをReadOnlyまたはDisabledに設定することができれば、要求は同時に処理されます。このリンクも参照してくださいhttp://johnculviner.com/asp-net-concurrent-ajax-requests-and-session-state-blocking/これは役に立ちます。

5

問題を引き起こした原因については別の説明があります。

質問が2013年に尋ねられたので、私は著者がすでに彼の問題の解決策を見つけたと仮定します。しかし、私の掘り出しに数時間を要したので、私は自分の経験を分かち合うことが私の義務だと信じています。

アーキテクチャ概要: Asp.Netクライアント側のAngularJSとサーバー側のWebApi 2.0およびSignalR 2.1のAsp.Net SPAアプリケーション。

問題の症状:アプリケーションは正常に起動し、機能しますが、すべての要求(SignalRとWebApi)が滞ってしまいます。 「固まっている」とは、WebApiリクエストがクライアント上で行われているが、コントローラメソッドは呼び出されないということです。フリーズする最初のものは、常にSignalR要求です。私はこれらの症状のための最も可能性の高い理由を見つけたいくつかの検索を行った後

Network Monitor

。これは、this post by John Culvinerで詳細に説明されている「セッション状態のブロック」の問題でした。

私のアプリケーションは、アプリケーションレベルでのモード読み取り専用に、私は単にそれらを切り替えセッションを使用していませんでしたので:これは助けにはならなかった

protected void Application_Start() 
{ 
    // Some extra initialization here 
    Context.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.ReadOnly); 
} 

を。

私は自分の研究を続けましたが、その頃にはキーワードですべての記事またはバグレポートを読みました。SignalR、接続、スタック、フリーズ、ハング。私の場合と関連しているようには見えませんでした。だから、使用中の技術の問題点を調べる代わりに、私自身のコードで何が間違っているのかを分析し始めました。それがあった。

私の問題はこのarticle by Shaunの説明がよくあります。ここに概要があります。標準的なMVC世界では、SignalRは接続自体を管理します。別のページに移動すると自動的に切断されます。だからあなたは接続を作成し、それを忘れることができます。不幸にも、これはSPA/AngularJSアプリケーションでは当てはまりません。 SignalR接続は、SPA内部のページが変更されたことを決して知らず、決して切断されません。ページに戻ると、新しいSignalR接続が作成されます。私の観察では、リクエストを処理するパイプを固着させるために、これを約10回行う必要があります。

ですから、ここにしなければならないすべてはSignalRの接続のために停止機能を作成して、SPA内のページを変更する前に、手動でそれを呼び出す:コントローラで

stop: function() { 
    if (connection && connection.state && connection.state !== 4 /* disconnected */) { 
     connection.stop(); 
    } 
}, 

$scope.$on('$destroy', function() { 
    clientPushHubProxy.stop(); 
}); 
+0

私は同じ問題に直面していますが、AngularJSを使用していません(私はASp.net MVCを使用しています)。 jqueryを使用して接続を停止する方法をお勧めしますか。 –