如何从Controller调用SignalR Core Hub方法?
我使用ASP.NET Core 2.0与Microsoft.AspNetCore.SignalR(1.0.0-alpha2-final).
我有与Excel,SolidEdge通信的Windows服务...当操作完成后,它会在ASP.NET核心应用程序中向我的控制器发送请求.现在我需要通过SignalR通知连接到服务器的所有客户端,外部程序完成了一些任务.
我无法改变窗口服务的工作方式.(无法从窗口服务连接到SignalR).
我为旧的SignalR(GlobalHost.ConnectionManager.GetHubContext)找到了很多解决方案,但是已经发生了很大变化,而且这些解决方案不再适用了.
我的控制器:
[Route("API/vardesigncomm")]
public class VarDesignCommController : Controller
{
[HttpPut("ProcessVarDesignCommResponse/{id}")]
public async Task<IActionResult> ProcessVarDesignCommResponse(int id)
{
//call method TaskCompleted in Hub !!!! How?
return new JsonResult(true);
}
}
Run Code Online (Sandbox Code Playgroud)
我的中心:
public class VarDesignHub : Hub
{
public async Task TaskCompleted(int id)
{
await Clients.All.InvokeAsync("Completed", id);
}
}
Run Code Online (Sandbox Code Playgroud) 我完全按照 MS 规则定义我的强类型 SignalR 集线器
public class OutputMessages : Hub<IOutputMessages>
{...}
Run Code Online (Sandbox Code Playgroud)
比用同样的方式将我的 SignalR hub 注入到控制器中
public class ApplicationAPIController : ControllerBase
{
public ApplicationAPIController(IHubContext<OutputMessages, IOutputMessages> _outputMessages)
{...}
}
Run Code Online (Sandbox Code Playgroud)
在启动中我将 SignalR 服务添加为
services.AddSignalR()
.AddHubOptions<OutputMessages>(options =>
{
options.EnableDetailedErrors = true;
})
Run Code Online (Sandbox Code Playgroud)
并定义端点
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<OutputMessages>("/OutputMessages", options =>
{
options.Transports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
});
});
Run Code Online (Sandbox Code Playgroud)
看起来不错?是的。而且编译也不错。但在运行时我收到
fail: Microsoft.AspNetCore.SignalR.HubConnectionHandler[1]
Error when dispatching 'OnConnectedAsync' on hub.
System.InvalidOperationException: Unable to resolve service for type 'Microsoft.AspNetCore.SignalR.Hub`1[IOutputMessages]' while attempting to activate 'OutputMessages'.
at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, …Run Code Online (Sandbox Code Playgroud)