SignalR 中豐富多彩的訊息推送方式

2022-01-15 13:05:13 字數 3057 閱讀 2490

在 signalr 中,使用者表示連線,乙個使用者代表乙個連線,乙個「系統使用者」可以建立多個連線身份,通過函式集線器,可以給乙個使用者的所有連線傳送訊息;比如乙個「系統使用者」擁有多個連線,這些連線分別是 web連線、android手機客戶端連線,ios手機客戶端連線、或者其它客戶端連線,「系統使用者」分別登入了這些客戶端,同時建立了多個連線;預設情況下這些連線都通過 claimtypes.nameidentifier 在 claimsprincipal 於使用者標識進行關聯。

** 注意:使用者識別符號是區分大小寫的,為了實現乙個客戶多個連線,本例還簡單實現了乙個基於 claimsidentity 登入介面,算是意外驚喜。

1.1 使用者連線管理

為了直觀的觀察到使用者是可以擁有多連線的,需要建立乙個本地靜態物件,用於儲存使用者連線

public class wechathub : hub

= new dictionary>();

public void send(chatmessage body)

public override task onconnectedasync()

else if (!userlist[username].contains(connectionid))

console.writeline("哇,有人進來了:,,", this.context.useridentifier, this.context.user.identity.name, this.context.connectionid);

return base.onconnectedasync();

}public override task ondisconnectedasync(exception exception)

}console.writeline("靠,有人跑路了:", this.context.connectionid);

return base.ondisconnectedasync(exception);}}

上面的**包含了乙個內部成員 userlist,用於儲存使用者的每個連線,在使用者進行 signalr 連線時,將當前連線儲存到 userlist 中,當連線斷開的時候,將當前連線從 userlist 中刪除。這樣就實現了乙個簡單的使用者連線管理。

在上面的**中,當前使用者暱稱是根據 var username = this.context.user.identity.name; 這行**獲取的,為了取得這個使用者暱稱,我們實現了乙個簡單的 useridentity 登入,然後將 user 資訊寫入到 cookie 中,最後才可以通過 var username = this.context.user.identity.name; 獲得當前登入使用者暱稱(熟悉 id 登入流程的同學應該不會感到陌生,實際上我也很少使用 id 驗證)

1.2 給單個使用者傳送訊息

}在 usercontroller 中,定義了上面的介面 sendtouser ,客戶端傳入使用者暱稱和訊息,然後服務端就會去根據 chathub.userlist 成員查詢目標使用者的連線資訊,最後,通過 sendasync 將訊息推送到目標客戶端連線中。

分組的概念類似於聊天室,每個房間就是乙個獨立的分組,使用者可以選擇加入 a 房間,也可以選擇加入 b 房間,如果業務允許,乙個使用者還可以加入多個分組(房間),通過使用分組對使用者進行管理,可以實現乙個或者多個聊天房間,使用者可以加入分組,也可以將使用者從分組中刪除(類似離開房間),這裡的使用者併發真正意義上的「系統使用者」,而是指系統使用者建立的那些 signalr連線。

** 注意:當連線斷開後重新發起連線的時候,signalr 不會保留組成員身份,必須重新加入分組。

下面的**演示了如何對分組進行操作,要對分組進行操作,主要包含三個方面:

2.1 加入分組

public async task addtogroupasync(string groupname)

2.2 離開分組
public async task removefromgroupasync(string groupname)

2.3 傳送訊息到指定分組
public async task sendtogroupasync(string groupname, chatmessage message));}

對分組的操作非常的簡單,幾乎都是一行**的事情,不得不說,微軟的封裝實在是太好了。

通過上面對使用者和分組的學習,再去擴充套件學習其它推送訊息的方式,就非常的好理解和上手,在 signalr 內部還有多種推送訊息的方式,他們分別是

3.1 all(全站推送)

3.2 others(全站推送排除自己)

3.3 othersingroup(指定分組推送,排除自己)

3.4 allexcept(除指定列表外的所有人)

3.5 演示**

listblacklist = new list();

public async task othersendasync(chatmessage body)

本示例**包含兩個簡單的介面

4.1 登入

4.2 各種方式傳送訊息

最近在做乙個開源專案,還處於試用階段,準備寫個使用的 wiki 出來,看看大家是否感興趣,此 singalr 系列只能不定期更新了,抱歉。

已託管到 github 倉庫

Mac Tips 讓你的終端豐富多 彩

不知用水果的朋友們,對其預設terminal的主題的印象如何,我是覺得很不爽,字太小,看著十分的吃力.於是乎.改 看截屏先.img 怎麼樣,還可以吧.下面介紹下步驟 安裝 url simbl url 和 url terminalcolors url 解壓後,雙擊 ir black.terminal ...

讓你的文字框(input)更加豐富多彩

css 上面的 中 input.txtinput 定義了文字框中有小圖示的通用樣式,其中 padding 的第四個值是定義文字內容從 20 象素處開始,原因是本文的是 16 象素大小,文字四周有 2 象素的邊距。具體到實際應用,需要根據你的大小決定。然後,我們又定義了 searchinput 和 c...

終端可以是豐富多彩的 echo實用技巧

當我們編寫指令碼,或者寫一些 新手教學 的時候,經常會用到更改配置檔案的情況,比如在centos7中更換docker國內映象源,傳統的做法是,備份舊檔案,然後,vi開啟 etc docker daemon.json,輸入 如果善用echo,我們可以一行命令搞定echo etc docker daem...