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 connectionIds, out IList Alive, out IList Dead) void 解析 connectionIds 的連線狀態,輸出連線中的ID列表 Alive 與 失去連線的ID列表 Dead

More

你也可以參考實際程式碼來了解如何開發 SignalR 的 Web 應用程式

results matching ""

    No results matching ""