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 ""