5

編集: David Fowler は、問題を再現するために完全なコードを要求しました。ここに完全なコードがあります

ここに再現されたコードに加えて、完全な Visual Studio 2010 ソリューションも次の URL にアップロードしました。

http://www.sendspace.com/file/lfeurf (URL は期限切れになり、機能しなくなりました)

お気軽にダウンロードしてお試しください。

ここに私の発見があります

  1. Hub コードにグループを 1 つだけ追加すると、アプリケーションは問題なく正常に動作します。
  2. 2 つのグループを追加すると、信号機が機能しなくなるか、一方向にのみ機能します。つまり、メッセージはブラウザ 1 からブラウザ 2 に送信されますが、ブラウザ 2 からブラウザ 1 には送信されません。

元の質問: MVC3 Web サイトで Signalr 1.0.0-rc1 を使用しています。クライアントが複数のグループに所属する必要がある場合があります。これが私のハブとクライアント側のjavascriptのコードです

クライアント側の JavaScript と HTML

<script type="text/javascript">
    //start signalr
    var message = $.connection.messageHub;

    // Declare a function on the message hub so the server can invoke it          
    message.client.send = function (message) {
        alert(message);
    }

    // Start the connection and join groups
    $.connection.hub.start();

    //bind click event of button to invoke send function on server
    $(document).ready(function () {
        $("#target").click(function () {
            message.server.send("Hello from signalr");
        });
    });
</script>

<button id="target">Click to send message to other clients</button>

サーバー側ハブ

public class MessageHub: Hub
    {
        public Task AddGroups()
        {
            //add 1st group
            Groups.Add(Context.ConnectionId, "foo");
            //add 2nd group
            return Groups.Add(Context.ConnectionId, "foobar");
        }

        //this method will be called from the client
        public void Send(string message)
        {
            Clients.OthersInGroup("foobar").send(message);
        }

        //automatically join groups when client first connects
        public override Task OnConnected()
        {
            return AddGroups();
        }

        //rejoin groups if client disconnects and then reconnects
        public override Task OnReconnected()
        {
            return AddGroups();
        }

    }

上記のコードは、最初の接続時に各クライアントに 2 つのグループを追加する必要がありますが、機能しません。デバッガーを使用して C# コードをステップ実行しましたが、エラーはスローされません。また、Chrome のコンソールを使用しても JavaScript エラーは表示されませんが、クライアントで Send 関数が呼び出されていません。次に、以下に示すように AddGroups() メソッドを変更して、グループを 1 つだけ追加しました。

public Task AddGroups()
   {
        //dont add first group
        //Groups.Add(Context.ConnectionId, "foo");
        //add only second group
        return Groups.Add(Context.ConnectionId, "foobar");
   }

これで、私のアプリケーションは完全に機能します。2 番目のグループを追加するにはどうすればよいですか? 複数のグループに参加することを誤解しているようです。誰かがそれを行う正しい方法を教えてもらえますか?

4

2 に答える 2

7

あなたの問題は、5秒後にタイムアウトすることreturn Groups.Add(Context.ConnectionId, "foobar");ですAddToGroups。指定されたクライアントがグループへの追加コマンドを受信したことをSignalR が確認するまで、Task返されたGroups.Addは完了しません。connectionIdこれが 5 秒以内に発生しない場合Taskはキャンセルされます。現在、とGroups.Addの内部での待機を妨げるバグがあるようです。OnConnectedOnReconnected

Taskからキャンセルされた を返しているため、サーバーはクライアントが接続を確立できないようにしています。OnConnectedOnReconnected

Task回避策は、返された from をGroups.Add次のように無視することです。

public class MessageHub: Hub
{
    public Task AddGroups()
    {
        //add 1st group
        Groups.Add(Context.ConnectionId, "foo");
        //add 2nd group
        return Groups.Add(Context.ConnectionId, "foobar");
    }

    //this method will be called from the client
    public void Send(string message)
    {
        Clients.OthersInGroup("foobar").send(message);
    }

    //automatically join groups when client first connects
    public override Task OnConnected()
    {
        AddGroups();
        return base.OnConnected();
    }

    //rejoin groups if client disconnects and then reconnects
    public override Task OnReconnected()
    {
        AddGroups();
        return base.OnReconnected();
    }

}
于 2012-12-17T23:03:18.547 に答える