10

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 呼び出し:

<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 呼び出し:

function LoadActivities(id, type, container, action, 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);
});

}

4

2 に答える 2

6

問題の原因について、別の説明があります。

この質問は 2013 年に出されたので、著者はすでに問題の解決策を見つけていると思います。しかし、私の経験を掘り下げるのに数時間かかったので、私の経験を共有するのは私の義務だと思います.

アーキテクチャの概要:クライアント側で AngularJS を使用し、サーバー側で WebApi 2.0 と SignalR 2.1 を使用する Asp.Net SPA アプリケーション。

問題の症状:アプリケーションは正常に起動して機能しますが、しばらくするとすべての要求 (SignalR および WebApi) が停止します。「スタック」とは、クライアントで WebApi リクエストが行われているが、コントローラー メソッドが呼び出されないことを意味します。最初に凍結されるのは、常に SignalR 要求です。

ネットワーク モニター

いくつかの検索を行った後、これらの症状の最も可能性の高い理由を見つけました。これは、 John Culviner によるこの投稿で詳しく説明されている「セッション状態のブロック」の問題です。

私のアプリケーションはセッションを使用していなかったので、単純にアプリケーション レベルでセッションを読み取り専用モードに切り替えました。

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

これは役に立ちませんでした。

私は調査を続けましたが、その時までに、SignalR、connection、stuck、freeze、hang というキーワードを含むすべての記事またはバグ レポートを読んだと思います。私の場合は何も関係ないようでした。そのため、使用中のテクノロジーの問題点を探す代わりに、自分のコードの問題点を分析し始めました。そして、そこにありました。

私の問題については、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();
});
于 2015-02-18T12:15:02.433 に答える