簡體   English   中英

如何為 SignalR hub 注入服務

[英]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>>();

據我所知,您不需要以這種方式注冊集線器。 只需在ConfigureServicesMapHub<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM