[鐵人賽Day4] 使用SignalR Hub (1)

SignalR Hub是什麼?

其實你從它的名字也看得出來是什麼,Hub不就是集線器的意思XD,不過這邊的線不是網路線而是BrowserServer溝通的橋樑,簡單來說就是幫你跟瀏覽器溝通的一個組件,有了他我們就能輕鬆撰寫溝通的事件,不用從最簡單連接關閉開始寫。

Hub Interface

來看看Hub裡面它幫我實作了什麼

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
public abstract class Hub : IDisposable
{
    protected Hub();

    public IHubCallerClients Clients { get; set; }

    public HubCallerContext Context { get; set; }

    public IGroupManager Groups { get; set; }

    public void Dispose();

    public virtual Task OnConnectedAsync();

    public virtual Task OnDisconnectedAsync(Exception exception);

    protected virtual void Dispose(bool disposing);
}

Clients基本上就是跟Client溝通用的物件,溝通的方法有3個

  • All :所有人
  • Group :群組
  • Caller:單一對象

Context則是Browser傳送過來的資訊,這些資訊是由前端的SignalR產生的,內容如下

  • ConnectionId:連接中的用戶識別碼
  • UserIdentifier:連接識別碼
  • ConnectionAborted:可得知連線中的用戶是否中止連接,正常連接時IsCancellationRequestedfalse

Groups則是負責管理群組的屬性

OnConnectedAsyncOnDisconnectedAsync不用說就是連接和斷線的事件囉

使用方法

實作一個Hub類別

在上一篇實作中有做過,只要開一個類別繼承Hub,裡面只要用override實作OnConnectedAsyncOnDisconnectedAsync2個方法就行,其他的方法都可以自訂,回傳如果不是傳個單一用戶,建議都使用await 非同步的方式。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class ChatHub : Hub
{
    public async Task SendMessage(string user, string message)
    {
        await Clients.All.SendAsync("ReceiveMessage", user,message);
    }

    public Task SendMessageToCaller(string message)
    {
        await Clients.Caller.SendAsync("ReceiveMessage", message);
    }

    public Task SendMessageToGroups(string message)
    {
        List<string> groups = new List<string>() { "SignalR Users" };
        await Clients.Groups(groups).SendAsync("ReceiveMessage", message);
    }
    // 連線
    public override async Task OnConnectedAsync()
    {
        await base.OnConnectedAsync();
    }
    // 斷線
    public override async Task OnDisconnectedAsync(Exception exception)
    {
        await base.OnDisconnectedAsync(exception);
    }
}

Configure中註冊建立的Hub

Starup.csConfigure中註冊,使用UseSignalR的Router裡註冊,可以註冊多個沒有限制

1
2
3
4
app.UseSignalR(routes =>
{
    routes.MapHub<ChatHub>("/chatHub");
});

Hub概念大概就這些,下一篇來講講Hub的延伸用法。

參考

comments powered by Disqus
使用 Hugo 建立
主題 StackJimmy 設計