【问题标题】:Instantiating IHubContext in ASP.NET Core在 ASP.NET Core 中实例化 IHubContext
【发布时间】:2020-07-01 13:42:41
【问题描述】:

我在我的 Web 项目的不同位置使用 SignalR。在我的 Controllers 和 HostedService 中,这似乎工作正常。客户端实例化与我的集线器的连接,我可以使用 IHubContext 实例与它们进行通信,该实例注入每个控制器/托管服务的构造函数中。

我有另一个单例,在后台运行(没有 HosteService 或 BackgroundTask)。此类也将 IHubContext 注入到构造函数中。仍然每次调用它时,似乎这个单例都有一个不同的 IHubContext 实例,因为这个上下文没有连接到它的客户端/组。

这个类在启动函数中被注册为this:

services.AddSingleton<IServiceEventHandler<TourMonitorEvent>, TourMonitorEventHandler>();

要配置 SignalR,我在 ConfigureServices 中执行以下操作:

services.AddSignalR().AddNewtonsoftJsonProtocol();

以及配置中的以下内容:

app.UseEndpoints(endpoints =>
{
    endpoints.MapHub<MyHubClass>("/hubEndpoint");
    endpoints.MapControllers();
});

IHubContext 在 Controllers/Hostedservices 和单例中注入如下:

public class MySingleton : IHandler<SomeGenericClass>
{
    private readonly IHubContext<MyHubClass> _hubContext;

    public MySingleton(IHubContext<MyHubClass> hubContext)
    {
        _hubContext = hubContext;
    } 
}

Controllers/HosteService 的实例化方式是否与我的 Singleton 不同,可能会影响 IHubContext 的实例化?

【问题讨论】:

  • 请提供您如何注入 IHubContext 的代码;)
  • @Kiril1512 我已经编辑回答,添加了IHubContext的注入

标签: asp.net-core singleton signalr instantiation


【解决方案1】:

documentation中所说:

集线器是瞬态的。

因此,由于您的 Singleton 不是 HostedService 或 BackgroundTask,我建议使用 DI 注入集线器。

private IHubContext<MyHubClass, IMyHubClass> MyHubClass
{
    get
    {
        return this.serviceProvider.GetRequiredService<IHubContext<MyHubClass, IMyHubClass>>();
    }
}

试试这个并验证现在的上下文是否符合您的预期。

【讨论】:

  • 我明白了。因此,如果集线器是瞬态的,我如何在两个不同的调用中在两个不同的控制器上获得相同的集线器(我假设,因为两者具有相同的状态)?
  • 你得到的是上下文,而不是中心。
  • 没错,上下文是单例,对吧?这是否意味着我拥有相同的对象(上下文),实例化了一次,因此具有相同的集线器(瞬态)?这至少是我在 Controllers/Hostedservices 中的行为。我有相同的单例和相同的集线器(状态)。
  • ASP.NET Core 有一个依赖注入框架,它消除了对这个全局单例的需要。当从 Hub 类外部调用集线器方法时,没有与调用关联的调用者。因此,无法访问 ConnectionId、Caller 和 Others 属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-10
  • 2019-10-15
  • 2019-11-04
  • 2021-08-08
  • 2019-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多