![](/img/trans.png)
[英]SignalR 2, Autofac 3.5, MVC 5 and OWIN: How to inject SignalR hub into a controller?
[英]How to inject service for SignalR hub
在我的 ASP.NET Core 7 MVC 應用程序中,在startup.cs
中注入中心服務,如下所示:
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddScoped<IHubContext<OstupultHub>>();
}
運行應用程序拋出異常
System.ArgumentException HResult=0x80070057
無法1[Store.Hubs.OstupultHub]' for service type 'Microsoft.AspNetCore.SignalR.IHubContext
[Store.Hubs.OstupultHub]”源=Microsoft.Extensions.DependencyInjection
堆棧跟蹤:
在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.Populate() 在 /_/src/libraries/Microsoft.Extensions.DependencyInjection/src/ServiceLookup/CallSiteFactory.cs:line 68...
如何解決此問題,以便集線器可以在 MVC controller 構造函數中使用,例如
public MyController(IHubContext<OstupultHub> hubContext ) { ...
集線器 class 定義為
using Microsoft.AspNetCore.SignalR;
namespace Store.Hubs;
public class OstupultHub : Hub
{ ...
}
根據
https://learn.microsoft.com/en-us/as.net/core/signalr/hubcontext?view=as.netcore-7.0
它應該工作。
目前我在 controller 構造函數 IServiceProvider 中使用
public OstupultController(IServiceProvider _provider )
{
provider = _provider;
}
然后在 controller
public async Task<ContentResult> ReceiveLogFile()
{
var pultHub = provider.GetRequiredService<IHubContext<OstupultHub>>();
await pultHub.Clients.All.SendAsync("sendLogFileMessage");
return new ContentResult() { Content ="sent" };
}
像其他服務一樣直接尋找使用服務。
服務被注入為
services.AddScoped<IHubContext<OstupultHub>>();
據我所知,您不需要以這種方式注冊集線器。 只需在ConfigureServices
和MapHub<OstupultHub>(...);
中調用services.AddSignalR()
); 在Configure
中。
在 Program.cs 中,就像 Guru 所說的那樣 using services.AddSignalR();
和
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Privacy}/{id?}");
endpoints.MapHub<ChatHub>("/chatHub");
});
在我的 controller 中:
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private readonly IHubContext<ChatHub> _hubContext;
public HomeController(ILogger<HomeController> logger, IHubContext<ChatHub> hubContext)
{
_logger = logger;
_hubContext = hubContext;
}
public IActionResult IndexAsync()
{
return View();
}
public async Task getInfo() {
await _hubContext.Clients.All.SendAsync("Notify", $"Home page loaded at: {DateTime.Now}");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.