コンソールアプリケーションのコンテキストで動作している自己ホスト型SignalRアプリケーションがあります。私は、私のASP.NETプロジェクトからSignalR.Coreアセンブリを参照しなくて済むように、ラッパークラスを使用してその中のハブに接続しています。したがって、アプリケーション内の別のC#クラスが、接続されたクライアントにメッセージをブロードキャストする責任があります。SignalR 2.2クライアントはメッセージを受信していません
私はPlanHub
メソッド(Register
とUnregister
)をJavascriptから直接呼び出すことができます。これらのブレークポイントはヒットします。しかし、クライアントメソッドをHub以外のクラスから呼び出すと(たとえ私がClients.All
を使ってグループ登録の問題を取り除いても)、クライアントはメッセージを受け取ることはありません。私は間違って何をしていますか?
このコードを実行すると、Clients.All.updateStatus(planId, message);
コードが正常にヒットしていることを確認できますが、クライアントのコンソールには何も記録されません。
がここに関連するコードです:
PlanHub.cs
public class PlanHub : Hub
{
private const string GroupPrefix = "PlanGroup_";
public void Register(int companyId)
{
Groups.Add(Context.ConnectionId, $"{GroupPrefix}{companyId}");
}
public void Unregister(int companyId)
{
Groups.Remove(Context.ConnectionId, $"{GroupPrefix}{companyId}");
}
}
PlanPublisher.cs
public class PlanPublisher
{
private readonly static Lazy<PlanPublisher> _instance = new Lazy<PlanPublisher>(() =>
new PlanPublisher(GlobalHost.ConnectionManager.GetHubContext<PlanHub>().Clients));
private IHubConnectionContext<dynamic> Clients { get; set; }
private PlanPublisher(IHubConnectionContext<dynamic> clients)
{
Clients = clients;
}
public static PlanPublisher Instance => _instance.Value;
public void UpdateStatus(int planId, string message)
{
//This code gets hit and no exceptions are thrown, but the clients
//never receive the message. Using Clients.All instead of my
//Groups for testing -- still doesn't work
Clients.All.updateStatus(planId, message);
}
}
(別のC#クラス内から)コードを呼び出す
PlanPublisher.Instance.UpdateStatus(plan.Id, $"Publishing started for {plan.Name}...");
Javascriptを
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script>
<script src="~/scripts/jquery.signalR-2.2.0.min.js"></script>
<script src="http://localhost:8080/signalr/hubs"></script>
<script>
$(document).ready(function() {
$.connection.hub.url = "http://localhost:8080/signalr";
var planMessagePublisher = $.connection.planHub;
planMessagePublisher.client.updateStatus = function (planId, message) {
console.log('Status: ' + planId + ' - ' + message);
};
$.connection.hub.start().done(function() {
//This works! My PlanHub.Register method gets called successfully
planMessagePublisher.server.register(@Model.CompanyId);
// New connection ID is successfully sent to console
console.log('Now connected, connection ID=' + $.connection.hub.id);
});
});
</script>
JSコンソールデバッガ出力
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: Auto detected cross domain url.
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: Client subscribed to hub 'planhub'.
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: Negotiating with 'http://localhost:8080/signalr/negotiate?clientProtocol=1.5&connectionData=%5B%7B%22name%22%3A%22planhub%22%7D%5D'.
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: webSockets transport starting.
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: Connecting to websocket endpoint 'ws://localhost:8080/signalr/connect?transport=webSockets&clientProtocol=1.5&connectionToken=AQAAANCMnd8BFdERjHoAwE%2FCl%2BsBAAAA5D8YUVyzBEG4tTlTaGn0MgAAAAACAAAAAAADZgAAwAAAABAAAABDjF1MaCTzZI0XTM8gC29xAAAAAASAAACgAAAAEAAAAKrk0jv%2FKF4YFzDvNwmSR8IoAAAAacm1d1r7dJpjOtVtCFIFRpugkubyZm1e5Z8OtOFtnhZyEBO1SO4lqhQAAABiG7hBydTiypPh8k2ZYz20ropNxw%3D%3D&connectionData=%5B%7B%22name%22%3A%22planhub%22%7D%5D&tid=6'.
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: Websocket opened.
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: webSockets transport connected. Initiating start request.
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: The start request succeeded. Transitioning to the connected state.
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: Now monitoring keep alive with a warning timeout of 13333.333333333332, keep alive timeout of 20000 and disconnecting timeout of 30000
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: Invoking planhub.Register
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: Invoked planhub.Register
それが正常に登録されますが、任意のデータを受け取ることはありません。 Clients.All.updateStatus(planId, message);
ブレークポイントが複数回ヒットしましたが、コンソールは追加のログデータを受信しませんでした。
EDIT:カスタム依存リゾルバが動作しているかどうかを調べることをお勧めしました。ここに掲載されたコードは、あなたがここに見ているものを除いて、他のほとんどのものではなく、独自のプロジェクトで生きています。 PlanPublisher.UpdateStatus()
DOESを呼び出すコードには、カスタム依存リゾルバがありますが、それはそれ自体のアセンブリで分離されているので重要ではありません。 PlanPublisher.cs
とPlanHub.cs
は、SignalR.CoreとSignalR.SelfHostを参照している非常に単純なプロジェクトに含まれています。
あなたはあなたの問題を再現する最小限の例を提供する必要があります。私はサーバー側とクライアント側の両方で提供されている正確なコードを実行しようとしましたが、問題なく正常に機能しました。 – Evk
@Scott、あなたは何とかそれを解決することができましたか?私も同じ問題に直面しています。面白いことに、私がグループのために公表しようとすると、それはうまくいくが、すべてではない。一方、この機能を試すために別のプロジェクトを作成すると、すべてうまく動作します。 – Max