从 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中文网其他相关文章!