LoginSignup
0
2

More than 3 years have passed since last update.

[ASP.NET Core SignalR] ハブクラス以外からメッセージを送信する(サーバからメッセージをプッシュする)

Posted at

チュートリアル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

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2