從Asp.Net Core 控制器呼叫SignalR Core Hub 方法
在本文中,我們將探討如何呼叫SignalR Core Hub 方法來自ASP.NET Core 控制器內。此功能允許伺服器端與連接的客戶端通訊以廣播事件或更新即時資料。
問題概述
在提供的場景中,ASP.NET任務完成後,核心應用程式接收來自 Windows 服務的請求。任務是通知所有連接的 SignalR Core 用戶端有關此事件的資訊。但是,Windows 服務無法直接與 SignalR 建立連線。
解決方案 1:將 HubContext 注入到 Controller
一種方法是將適當的 HubContext 注入到控制器類別中。這使得可以從控制器的操作方法直接呼叫集線器方法。
[Route("API/vardesigncomm")] public class VarDesignCommController : Controller { [HttpPut("ProcessVarDesignCommResponse/{id}")] public async Task<IActionResult> ProcessVarDesignCommResponse(int id) { await this.HubContext.Clients.All.InvokeAsync("Completed", id); return new JsonResult(true); } private IHubContext<VarDesignHub> HubContext { get; set; } }
此方法允許與所有連接的客戶端直接通信,但可能會產生效能影響,具體取決於客戶端的數量。
解決方案2:類型化集線器和客戶端介面
另一種方法涉及定義類型化客戶端介面和從具有類型化客戶端介面的相應集線器繼承。這使得可以將類型化的 HubContext 注入到控制器中以進行特定的方法呼叫。
類型化客戶端介面:
public interface ITypedHubClient { Task BroadcastMessage(string name, string message); }
Hub繼承自類型化客戶端介面:
public class ChatHub : Hub<ITypedHubClient> { public void Send(string name, string message) { Clients.All.BroadcastMessage(name, message); } }
控制器注入與方法呼叫:
[Route("api/demo")] public class DemoController : Controller { IHubContext<ChatHub, ITypedHubClient> _chatHubContext; public DemoController(IHubContext<ChatHub, ITypedHubClient> chatHubContext) { _chatHubContext = chatHubContext; } [HttpGet] public IEnumerable<string> Get() { _chatHubContext.Clients.All.BroadcastMessage("test", "test"); return new string[] { "value1", "value2" }; } }
這種方法可以與客戶更有針對性、更有效率的溝通。
以上是如何從 ASP.NET Core 控制器呼叫 SignalR Core Hub 方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!