在 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...