為了保持客戶端和服務端之間的持久性連接的開發性,並且使用傳輸在這這樣的連接上發送數據,這個用來訪問SignalR持久性連接的底層API提供了一個隱藏底層固有復雜性的抽象層。
事實上,通過該API訪問通信通道和在底層使用Socket方式類似:
在服務端,當連接打開或關閉、接受數據、給客戶端發送信息時我們將被通知。在客戶端,我們可以打開或關閉連接,發送或接受任何數據。與Socket一樣,消息沒有格式,可以說它的格式是傳統數據格式——文本字符串。
從客戶端來看,只需要發起一個到服務端的連接就可以立即使用它來發送數據,並通過SignalR調用的一個回調函數執行信息的接收。
從服務端來看,持久連接是繼承自PersistentConnection的一個類,為了能夠在某個事件產生時允許采取控制,可以對該類的一些方法進行重寫。
每個持久連接都可以通過某個URL從外部進行訪問。因此可以采用和其他框架,如 mvc、web api類似的一些方法。
接下來就是配置SignalR將每一個持久連接同其訪問路徑進行關聯。
以前的SignalR版本必須通過global.asax執行相關的注冊,但在2.0後都已經整合到OWIN中。
SignalR應用程序運行基於OWIN上的宿主進程中,該宿主程序將在應用程序的根名稱空間查找一個為名Startup的類,然後執行它的Configuration方法。
首先在Web應用程序的根目錄建立Startup類,
如:
1 using System; 2 using System.Threading.Tasks; 3 using Microsoft.Owin; 4 using Owin; 5 6 [assembly: OwinStartup(typeof(Startup))] 7 8 public class Startup 9 { 10 public void Configuration(IAppBuilder app) 11 { 12 13 } 14 }
上面的Configuration方法可以看成是啟動方法,在該方法裡可以建立相對應的SignalR連接和路徑映射。
現在建立一個持久性連接類:TestConnection該類繼承自PersistentConnection;當某些和服務以及和PersistentConnection類連接有關的事件產生時,將調用該類提供的虛方法,為了實現這樣的邏輯,只需要重寫相關方法即可。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Threading.Tasks; 5 using System.Web; 6 using Microsoft.AspNet.SignalR; 7 8 public class TestConnection : PersistentConnection 9 { 10 protected override Task OnConnected(IRequest request, string connectionId) 11 { 12 return Connection.Send(connectionId, "Welcome!"); 13 } 14 15 protected override Task OnReceived(IRequest request, string connectionId, string data) 16 { 17 return Connection.Broadcast(data); 18 } 19 }
在TestConnection類中,有兩個重寫自PersistentConnection的方法:OnConnected 和OnRecevied,它們分別表示當有客戶端連接時和當客戶端發送消息服務端接收消息時。其實,在TestConnection中還可以重寫其他方法,在這裡默認是這兩個。
這兩個方法它們有request和connectId這兩個共同的參數,request表示與請求相關的參數類似於asp.net中的Request,connectionId是一個字符串,表示客戶端的唯一標識符,每個連接的客戶端不同,connectionId就不一樣。
在OnConnected這個方法中,
return Connection.Send(connectionId, "Welcome!");//表示向剛剛連接的客戶端發送“welCome!”字符串消息,這個方法只對一個指定的用戶發消息。connectionId就是客戶端唯一標識符。
在OnRecevied這個方法中,
return Connection.Broadcast(data);//data是某一個客戶端發送過來的消息,整個方法意思是向所有的客戶端發送data消息。