3

いくつかの SignalR Hubs とそれらのいくつかの個別の OnDisconnected イベントを設定しようとしています。

質問のために、いくつかのページに 2 つのハブがあります。

  1. StatusHub: Web サイトでのユーザーのステータスを処理します。このハブのメソッドは Web サイトのすべてのページで呼び出され、ユーザーの接続と切断のロジックを処理して、ユーザーが Web サイトをナビゲートするときにユーザーの状態を更新します。

  2. ChatHub: Web サイトのリアルタイム チャットに関連するすべてを処理します。このハブのメソッドは、ユーザーが特定のボタンをクリックしたときに、Web サイトの特定のページからのみ呼び出されます。

私が経験している問題は、両方のハブ クラスが独自のバージョンの OnConnected メソッドと OnDisconnected メソッドを実装しているにもかかわらず、StatusHub メソッドのみが起動され、ChatHub メソッドが呼び出されないことです。

それが仕様によるものなのか、それとも何か間違っているのかはわかりません。これまでのところ、ハブサーバーへの接続は単一の接続であり、特定のハブには接続せず、ハブサーバー全体に接続するため、メソッドの1つだけに接続するという記事と回答をいくつか読みました認識され、呼び出されます。

SignalR の経験が豊富な方は、2 つのハブの接続イベントと切断イベントを分離する方法があるかどうか、またはそれが本当に意図されているかどうかを教えてもらえますか?

シナリオをよりよく説明するために、いくつかのコードを以下に示しますが、さらにコードを見る必要がある場合は、質問して追加します.

StatusHub.cs

public class StatusHub : Hub { 
    public override Task OnDisconnected()
    {
        //handles the disconnected event as needed
        return base.OnDisconnected();
    }


    public override Task OnConnected()
    {
        //handles the connected event as needed
        return base.OnConnected();
    }
}

ChatHub.cs

public class ChatHub : Hub { 
    public override Task OnDisconnected()
    {
        //should handle the chat disconnected event but is never reached
        return base.OnDisconnected();
    }


    public override Task OnConnected()
    {
        //should handle the chat connected event but is never reached
        return base.OnConnected();
    }
}

ハブ サーバー接続を開始するコード (すべてのページで実行):

$.connection.hub.start().done(function() {
    //a lot of code here (irrelevant to the question I think)
});
4

1 に答える 1

2

これを解決しましたか?あなたが非常に説明していることは、 のクライアントメソッドを登録しないことの問題のようですChatHub。クライアント メソッドが登録されていない場合、クライアントはサーバー上でハブ メソッドを呼び出すことができ、結果を取得します (ステートレス プロトコルの要求応答の性質と非常によく似ています)。応答を提供するように要求されていないクライアント (ハブ メソッドを呼び出すクライアントによって) の場合、そのような接続がOnConnected,OnReconnectedおよびOnDisconnectedオーバーロードをトリガーしないように設計されています。

解決策はかなり単純です。次のような no-op クライアント メソッドを登録するだけで十分です。

$(function()
{
  // A no-op client method so the hub's
  // OnConnected, OnReconnected and OnDisconnected method overloads are triggered.
  $.connection.chatHub.client.noop = function () { };
  $.connection.hub.start()
    .done(function() { console.log("SignalR connection is up and running."); })
    .fail(function(error) { console.log(error); });
});

これに至った正確な理由はわかりませんが、通常、接続されたクライアントを追跡し、それらを抽象化 (列挙できないため SignalR グループが提供できないもの) に関連付けるために使用されるオーバーロードは、突き返すことができない接続なので、この方法で行う必要がある理由についての私の2セントです.

于 2014-10-24T21:19:57.100 に答える