17

SignalR の JS クライアント ハブに問題があるようです。

問題は、「on」ハンドラーが機能していないように見えることです。エラーは発生しませんが、サーバーから送信されたシグナルを受信しません。以下のコードは、正常に動作するサーバーを (invoke を使用して) 呼び出す場所の抜粋を示しています。サーバーでは、acceptHubData にコールバックします。これはクライアントで取得する必要がありますが、そうではありません。

私の目的は、各ページが特定のハブへの接続を開き、ユーザーが別のページに移動したときにこの接続を解放するページに移動するときです!!

EDIT : 次のコード スニペットを使用すると機能しますが、「on」イベントを使用してさらに下のコードが機能しないのはなぜでしょうか!

    var superHub = $.connection.mySuperHub;

    superHub.client.acceptHubData = function (data) {
        $('<li>hello there' + data + '</li>').prependTo($('#ul1'))
    }

    $.connection.hub.start().done(function () {
        $('<li>done phase 1</li>').prependTo($('#ul1'))
    });

どんな助けでも大歓迎です!

これはクライアント コードです (js で)

$(document).ready(function () {

    var myHub;

    try {

        var connection = $.hubConnection();

        connection.start().done(function () {

            myHub = connection.createHubProxy("mySuperHub");

            myHub.on('acceptHubData', function (data) {
                alert(data);   // THIS IS NOT CALLED!
            });

            myHub.invoke('AcceptSignal', "hello from the client2");

        });

    }
    catch (e) {
        alert(e.message);
    }
});

これはサーバーコードです:

[HubName("mySuperHub")]
public class MyHub : Hub
{

    private readonly HubEngine _hubEngine;

    public MyHub() : this(HubEngine.Instance) { }

    public MyHub(HubEngine hubEngine)
    {
        _hubEngine = hubEngine;
    }

    public void AcceptSignal(string msg)
    {
        Clients.Caller.acceptHubData("hi");
        Clients.All.acceptHubData("hi");
    }

}
4

2 に答える 2

47

メソッドを使用してon、最新バージョンの SignalR で JS クライアント ハブ メソッド呼び出しのイベントを追加できますが、hubProxyを呼び出す前に にイベント リスナーを追加しないhubConnection.start()と、ハブにサブスクライブされません。SignalR は、hubConnection開始時にイベント ハンドラーがあるハブにサブスクライブします。ハブにサブスクライブしていない場合、start() の後にそのハブにイベントを追加しても機能しません。

start() の前に少なくとも 1 つのイベント リスナーをハブに追加すると、何もしなくても、onstart() の後で必要なイベント ハンドラーをハブに追加すると、ハンドラーが呼び出されます。

を呼び出す前にhubProxy.on('eventName', function (...またはを使用してイベントを追加するかどうかは問題ではありませんが、 が呼び出された後にのみイベント リスナーが正常に追加されます。autogeneratedHubProxy.client.eventName = function (...start()onstart()

于 2013-04-17T19:14:44.550 に答える
1

使用している SignalR のバージョンはわかりませんが、サーバーで次の構文を使用すると、より多くの成功を収めています。

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.All.acceptHubData("hello");    

そして私のクライアントで:

myHub.client.acceptHubData = function (data) {
    console.log(data);
}
于 2013-04-17T15:58:55.480 に答える