チュートリアルWebアプリの場合
https://docs.microsoft.com/ja-jp/aspnet/core/tutorials/signalr?view=aspnetcore-3.1&tabs=visual-studio
上記公式のチュートリアル通りに作成した場合、ハブは以下のような実装になる
namespace SignalRChat.Hubs
{
public class ChatHub : Hub
{
public async Task SendMessage(string user, string message)
{
await Clients.All.SendAsync("ReceiveMessage", user, message);
}
}
}
上記の場合、クライアントからSendMessageがコールされた場合に"ReceiveMessage"を送信する
→ クライアントからトリガとかける要求/応答型
ハブクラス以外からメッセージを送信する
using Microsoft.AspNetCore.SignalR;
using System.Threading.Tasks;
using SignalRChat.Hubs;
namespace SignalRChat
{
public class app
{
private IHubContext<ChatHub> Hub
{
get;
set;
}
public app(IHubContext<ChatHub> hub)
{
Hub = hub; // ハブコンテキストを取得
}
public async Task pushMessage(string msg)
{
await Hub.Clients.All.SendAsync("pushMessage", msg); // メッセージ送信
}
}
}
ハブクラス内でメッセージを送信する場合は、
Clients.All.SendAsync(...)
、Clients.Caller.SendAsync(...)
、Clients.Others.SendAsync(...)
等送信先を選択できるが、
ハブクラス以外ではHub.Clients.All.SendAsync(...)
しか使用できない
ハブクラス内ではクライアントがトリガとかけている要求/応答型となっており、要求元がいるため要求元のみに応答を返す、要求元以外に応答を返す、全クライアントに応答を返すことができる。
それに対して、ハブクラス以外ではサーバ起点となっており、要求元がいないため、全クライアントに送信することしかできない。
参考
https://docs.microsoft.com/ja-jp/aspnet/core/signalr/hubcontext?view=aspnetcore-3.1
https://github.com/aspnet/SignalR-samples/tree/master/StockTickR/StockTickRApp