SignalR Helper
ApiControllerSignalR
是一個繼承 ApiController
的擴充類別,它使你在 ApiController
中處理 SignalR 的連線更為方便。在本章節將說明.NET Web API 整合 SignalR 的方式與使用案例。
Resources
Configuration
首先在 Web API 專案根目錄下新增 Startup.cs
並撰寫以下程式碼 (這裡的設定可以依照需求調整)
示範:
public class Startup
{
public void Configuration(IAppBuilder app)
{
var hubConfiguration = new HubConfiguration();
hubConfiguration.EnableDetailedErrors = true;
app.MapSignalR(hubConfiguration);
}
}
接下來在根目錄下的 Global.asax
中加入以下程式碼 (這裡的設定可依照需求調整),若需要完整說明可以參考官方文件中的了解和處理 signalr 的連線存留期事件
示範:
// Long Polling 最長連接時間,預設為 110 秒。時間到將重新發起連結 (Reconnect Event)
GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromSeconds(110);
// 失去連線最多等待時間,預設為 30 秒,超過該時間將中斷連結 (Disconnected Event)
GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromSeconds(30);
// 若不是使用 Long Polling 連線,SignalR 將每隔 10 秒 (預設) 發起 keepalive 封包來確認連線狀態
// 這個數值不可超過 DisconnectTimeout 的 1/3
GlobalHost.Configuration.KeepAlive = TimeSpan.FromSeconds(10);
備註:如果你想使用預設的設定,可以跳過上面這個步驟
在 Web API 專案目錄下新增一個 Hubs
目錄,並在其中新增一個 MsgHub.cs
類別,可視需求複寫對應事件,如此就設定完成
示範:
[HubName("messaging")] // Hub 名稱
public class MsgHub : Hub
{
public override Task OnConnected(){} // 可複寫,OnConnected 事件發生時會觸發
public override Task OnReconnected(){} // 可複寫,OnReconnected 事件發生時會觸發
public override Task OnDisconnected(bool stopCalled){} // 可複寫,OnDisconnected 事件發生時會觸發
}
Super simple to use
在欲使用 SignalR 的 Controller 中,將原先繼承的 ApiController
改為 ApiControllerSignalR
類別,如此一來便能使用下方示範的擴充功能
示範:
[RoutePrefix("api")]
public class MsgController : ApiControllerSignalR<MsgHub>
{
[HttpPost]
[Route("msg/send")]
public HttpResponseMessage sendMsg([FromBody]ModelMsg msg)
{
// 廣播給某個對象
Hub.Clients.Client( id ).pushMsg("...");
// 檢查特定 ID 連線狀態
bool isAlive = IsConnectionIdAlive("Connection ID");
string[] connectionIds = new string[]{ };
// 廣播給某群人
Hub.Clients.Clients(connectionIds).receiveMsg("...");
// 傳入一群 IDs ,並解析目前的連線狀態
// Alive: 連線存活 ; Dead: 失去連線
IList<string> Alive, Dead;
ResolveConnectionIds(connectionIds, out Alive, out Dead);
foreach(var id in Dead)
{
// 無效的連線 ID
}
}
}
ApiControllerSignalR Class Reference
雖然將 SignalR 整合到 .NET Web API 中,但它們還是兩個獨立的程序,ApiControllerSignalR
搭建了從 Web API 存取 SignalR 連線狀態的方法,讓你可以更方便地存取用戶連線狀態。
Struct
無,屬於 abstract
類型
Property
無
Method
名稱 | 類型 | 描述 |
---|---|---|
Hub | IHubContext | 取得目前的 IHubContext 物件 |
IsConnectionIdAlive(string connectionId) | bool | 檢查 connectionId 目前的連線狀態 |
ResolveConnectionIds(IList |
void | 解析 connectionIds 的連線狀態,輸出連線中的ID列表 Alive 與 失去連線的ID列表 Dead |
More
你也可以參考實際程式碼來了解如何開發 SignalR 的 Web 應用程式