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");
}
}
on
メソッドを使用して、最新バージョンのSignalRでJSクライアントハブメソッド呼び出しのイベントを追加することはできますが、hubConnection.start()
、ハブにサブスクライブされません。 SignalRは、hubConnection
の開始時にイベントハンドラーがあるハブにサブスクライブします。ハブにサブスクライブしていない場合、start()の後にそのハブにイベントを追加することはできません。
Start()の前に少なくとも1つのイベントリスナーをハブに追加すると、何も実行されない場合でも、start()の後にon
を使用して、ハブに必要なイベントハンドラーを追加できます。ハンドラーが呼び出されます。
start()
を呼び出す前に_hubProxy.on('eventName', function (...
_または_autogeneratedHubProxy.client.eventName = function (...
_を使用してイベントを追加するかどうかは関係ありませんが、start()
の後にイベントリスナーを正常に追加できるのはon
だけです。 ()] _が呼び出されます。
使用しているSignalRのバージョンはわかりませんが、サーバーで次の構文を使用することで、より多くの成功を収めています。
var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.All.acceptHubData("hello");
と私のクライアントで:
myHub.client.acceptHubData = function (data) {
console.log(data);
}