17

SignalR でゲームを書いています。アイデアは、「ディスプレイ」として使用されるラップトップに接続し、次にスマートフォンに接続して「ジョイスティック」として使用するというものです。セットアップ全体が非常にうまく機能します。

すべてが機能するようになったので、コードをリファクタリングすることにしました。ジョイスティックとディスプレイの関係は一方通行であることに気付きました (ディスプレイはジョイスティックに情報を送り返す必要はありません)。したがって、ジョイスティックで signalR 呼び出し可能なクライアント関数は必要ないと判断しました (たとえばgameHub.client.joyStickMethod()、ジョイスティック js.

その時、私は奇妙なことを発見しました

public override Task OnConnected()さまざまなタイプのクライアント (ディスプレイとジョイスティック) を処理するためにオーバーライドしたハブ メソッドは、 myHub.client.clientSideMethod(). これが私が扱っている例です:

        var gameHub = $.connection.gameHub;
        gameHub.client.connection();
        $("#joystick").joystick({
            hub: gameHub
        });

        gameHub.client.activateJoystick = function () { };
        $.connection.hub.qs = "type=joystick&gameId=" + "@Model.Id";
        $.connection.hub.start();   //this will invoke on connected

空のクライアント側メソッドがわかりますか? OnConnectedこれが、サーバー側で呼び出される理由です。そのコード行を削除すると、呼び出されなくなります。

        var gameHub = $.connection.gameHub;
        gameHub.client.connection();
        $("#joystick").joystick({
            hub: gameHub 
        });

        //gameHub.client.activateJoystick = function () { };
        $.connection.hub.qs = "type=joystick&gameId=" + "@Model.Id";
        $.connection.hub.start();   //this will invoke on connected

ハブにはクライアント側のメソッドがないため、これは機能しません。おそらくRegistrateJoystickハブにメソッドを追加して呼び出すこともできますが、動作は予期しないものだと思います。したがって、私の質問は次のとおりです。

OnConnectメソッドが呼び出されるように、手動でハブに「接続」する方法はありますか?

4

2 に答える 2

14

それは設計によるものです。ハブへのサブスクリプションがない場合、その特定のクライアントはサーバーからクライアントへのメッセージを取得できません。ハブで引き続きメソッドを呼び出すことができます。

于 2013-01-11T16:34:11.617 に答える
1

これを回避する方法は、配線する偽のハブを用意することです。何もせず、void を返します。少なくともこの方法では、ゲームをブートストラップするときに、接続で .start() を呼び出す前に、偽のハブでこの偽のメソッドに接続します。これにより、onConnected() メソッドが取得されます。

私は同意します、これはとても奇妙な行動です。接続を確立すると、イベントをリッスンしていなくても onConnected() が発生するはずです。

これをさらに奇妙にしているのは、ハブ認証を行っている場合です。AuthorizeAttribute から派生する場合、クライアントで呼び出すメソッドごとに AuthorizeHubMethodInvokation() が呼び出されますが、AuthorizeHubConnection() は呼び出されません。

- アップデート

私は自分のプロジェクトでこれをいじりました。サーバー上に存在しないクライアント上にハブ プロキシを作成するという最初のアイデアがありましたが、これは失敗します。ただし、実際のハブに接続することはできますが、偽のコールバックに接続することはできます。これは機能し、実際のメソッドの作成を回避できます。

これは明らかに恐ろしい回避策ですが、他に何もないにもかかわらず、仕事をします。

于 2015-10-14T14:14:56.033 に答える