2012-12-28 10 views
5

JSクライアントメソッドを呼び出すためにSignalRサーバー側のハブコードを取得できません。逆はうまくいきます。クライアントがサーバーにメッセージを送信すると、サーバーは期待どおりに配信されます。私は明らかにトラップを避けるためにかなり注意してきましたが、私はまだ何かを見過ごしていると思います。ここに私のコードだ:MessageHub.csからSignalR JSクライアントメソッドが呼び出されない

public bool SendMessage(ClientMessage message) 
{ 
    ... 
    Clients.All.addMessage("my message"); 
    ... 
} 

Javascriptを:

$.connection.hub.start() 
    .done(function() { 
     messageHub = $.connection.message; 

     // addMessage is never invoked. 
     messageHub.client.addMessage = function (message) { 
      alert('message added'); 
     }; 

     /* // I tried this based on some sample code but still not invoked. 
     messageHub.addMessage = function (message) { 
      alert('message added'); 
     }; 
     */ 

     // This works as expected. 
     messageHub.server.registerUser(userId); 
     ... 
    }); 

前述したように、私はセットアップで任意の明白な欠陥を見つけることが、ここですることはできません場合によっては関連する点がいくつかあります:

  • 接続が確立され、サーバー側のメソッドが呼び出されます。
  • これはおそらく無関係ですが、私は振る舞いに変化のない別の転送を強制しようとしました。
  • クライアントメソッド名は、どの時点でもサーバーメソッド名と競合しません。
  • 私はまた、特定のクライアント接続(実際には目標です)にメッセージを送信しようとしました。
  • 私はクライアントとサーバーの両方でログを有効にしていますが、どちらの場合でも関連するものは表示されません。

だから、明らかに何か分かりませんか?そうでない場合は、障害ポイントを特定する最善の方法は何ですか?

P.S.しかし、これは特に質問には関係しませんが、何らかの理由でFiddlerは私のブラウザからのトラフィックをキャプチャしていないため、WSやHTTPトラフィックのデバッグに少し挑戦しています。

答えて

29

答えは実際にはかなり簡単でした(ただし、前回のリリースから1.0.0.0-rc1から1.0.0.0にアップグレードしましたが、このシナリオを変更していないことは間違いありません)。

私は答えをここに見つけました:https://stackoverflow.com/a/15074002/32935(具体的には、私の解決策は最初の答えでしたが、2番目は原因を特定するのに役立ちました)。

基本的に、元の回答に行きたくない人は、done()コールバックではなく、接続に対してstart()メソッドを呼び出す前にクライアントメソッドをセットアップする必要がありました。ここに例があります:

$.connection.message.client.addMessage = function (message) { 
    alert('Now it works!'); 
}; 

$.connection.hub.start() 
    .done(function() { 
     console.log('Connection established!'); 
    }); 
+0

あなたは私の一日を完全に保存しました。 – vfportero

+0

恐ろしい!どうもありがとうございます! – Oleg

+0

これは非常に重要なヒントです!あなたは私の日を救った:)ありがとう! –

-2

Clientsオブジェクトの上にマウスを置くと、JSで定義したすべての機能が表示されますか?

とにかく、あなたの方法がうまくいかない理由はわかりませんが、これはクライアント側の書き方です。たぶんあなたはこの方法で試すことができます。

$(function() { 

    var hub = $.connection.RatesHub; 


    $.connection.hub.start().done(function() { 
     /*Logic goes here*/ 
    }); 

    $.extend(hub.client, { 
     FuncName: function (msg) { 
      /*Logic goes here*/ 
     } 
    }); 

} 

サーバーで認識される機能は、すべて$ .extendを使用します。

希望に役立ちます。

+0

これはあなたの状況では、doneメソッドのコールバックが呼び出される前に$ .extendが終了しているためです。これにより、start()コールと$ .extend(起こり得る)の間で実行をブロックするイベントが発生した場合、どのメソッドもSignalRにアクセスすることができない競合状態になります。 –

関連する問題