6

JS クライアント メソッドを呼び出すための SignalR サーバー側ハブ コードの取得に問題があります。逆は正常に機能しているため、クライアントがサーバーにメッセージを送信すると、期待どおりに配信されます。明らかな罠を避けるようにかなり注意してきましたが、まだ何かを見落としているようです。これが私のコードです:

MessageHub.cs から:

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);
        ...
    });

上記のように、セットアップに明らかな欠陥は見つかりませんが、関連する可能性のあるいくつかのポイントを以下に示します。

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

それで、上記を考えると、明らかな何かが欠けていますか?そうでない場合、障害点を特定する最善の方法は何ですか?

PSこれは質問とは特に関係ありませんが、何らかの理由でFiddlerがブラウザからのトラフィックをキャプチャしなくなったため、WSまたはHTTPトラフィックのデバッグが少し難しくなっています.Windows 8の問題だと思います. ..

4

2 に答える 2

36

したがって、答えは実際には非常に単純でした (ただし、前回のリリース以降、1.0.0.0-rc1 から 1.0.0.0 にアップグレードしましたが、このシナリオが大幅に変更されたことはないと確信しています)。

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

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

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

$.connection.hub.start()
    .done(function () {
        console.log( 'Connection established!' );
    });
于 2013-02-27T17:31:47.463 に答える
-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 を使用します。

それが役立つことを願っています。

于 2012-12-31T11:00:22.423 に答える