2013-01-11 42 views
16

私はSignalRでゲームを作成しています。アイデアは、ノートパソコンに接続して「ディスプレイ」として使用し、スマートフォンに接続して「ジョイスティック」として使用することです。セットアップ全体がうまく機能します。SignalR:クライアントメソッドがない場合、Hub OnConnectedは呼び出されません

すべての機能が完了したので、コードをリファクタリングすることにしました。私は、ジョイスティックとディスプレイの関係が1つの方法であることを認識しました(ディスプレイはジョイスティックに情報を戻す必要はありません)。したがって、私は、私は(ジョイスティックJSでgameHub.client.joyStickMethod()のための使用はありません例えばジョイスティック上の任意のsignalR呼び出し可能なクライアント機能を必要としなかったことを決めた。

それは、私はそれがあることが判明し

奇妙な何かを発見されました私はmyHub.client.clientSideMethod()を定義しない限り、ハブは、私は、クライアント(ディスプレイとジョイスティック)の異なる種類に対処するためにオーバーライドする方法public override Task 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 

サイドメソッド?そのため、サーバー側で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メソッドが呼び出されるように手動でハブに接続する方法はありますか?

答えて

14

これは仕様です。ハブへのサブスクリプションがない場合、その特定のクライアントはサーバーからクライアントへのメッセージを取得できません。依然としてハブ上でメソッドを呼び出すことができます。

+6

お返事ありがとうございます。私はあなたが言っていることの論理を理解していますが、同時に、クライアントが呼び出し可能なメソッドを持っているかどうかにかかわらず、サーバー側のメソッド "OnConnect"の名前は私には聞こえると思います。 – pardahlman

+1

確かに、それはどのように動作します。メソッドはOnConnectedです。 – davidfowl

+1

混乱を避けるために、pardahlmanが命名されていると少し直感的ではないと言ったことをエコーするのは、文書でかなり明示的に呼び出す価値があるかもしれません。 –

1

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

私は同意する、これは奇妙な動作です。接続を行う場合は、イベントを待機していなくても、onConnected()を呼び出す必要があります。

ハブの承認を行っている場合、これはさらに奇妙になります。あなたのケースでAuthorizeAttributeから派生した場合、クライアントで呼び出す各メソッドに対してAuthorizeHubMethodInvokation()が呼び出されますが、AuthorizeHubConnection()は決して呼び出されません。

- 更新

私のプロジェクトでこれを使って遊んだ。私は、サーバー上に存在しないクライアント上にハブプロキシを作成するという基本的な考え方を持っていましたが、これは失敗します。ただし、実際のハブに接続するだけで、偽のコールバックにすることはできます。これはうまくいき、実際の方法を作成することができます。

これは明らかに恐ろしい仕事ですが、他の何ものにも触れていません。

関連する問題