Asp.net core 在ASP.NET核心中实例化IHubContext

Asp.net core 在ASP.NET核心中实例化IHubContext,asp.net-core,singleton,signalr,instantiation,Asp.net Core,Singleton,Signalr,Instantiation,我在web项目的不同位置使用SignalR。在我的控制器和托管服务中,这似乎工作得很好。客户端实例化与我的集线器的连接,我可以使用IHubContext实例与它们通信,该实例注入每个控制器/hostedservice的构造函数中 我有另一个单身,在后台运行(没有HostService或BackgroundTask)。这个类也正在构造函数中注入IHubContext。但每次调用它时,似乎这个单例都有一个不同的IHubContext实例,因为这个上下文没有连接到它的客户机/组 此类正在启动函数中注册

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

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

此类正在启动函数中注册为:

services.AddSingleton();
要配置信号器,我在ConfigureServices中执行以下操作:

services.AddSignalR().AddNewtonsoftJsonProtocol();
并在“配置”中执行以下操作:

app.UseEndpoints(端点=>
{
endpoints.MapHub(“/hubEndpoint”);
endpoints.MapControllers();
});
IHubContext列表在控制器/主机服务和单例中注入如下:

公共类MySingleton:IHandler
{
私有只读IHubContext\u hubContext;
公共MySingleton(IHubContext-hubContext)
{
_hubContext=hubContext;
} 
}
控制器/主机服务的实例化方式是否与我的Singleton不同,可能会影响IHubContext实例化?

如中所述:

集线器是暂时的

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

private IHubContext MyHubClass
{
得到
{
返回此.serviceProvider.GetRequiredService();
}
}

尝试此操作并验证上下文是否如您所期望的那样。

请提供如何注入IHubContext的代码;)@Kiril1512我对答案进行了编辑,添加了IHubContextI的注入。如果集线器是暂时的,我怎么会在两个不同的调用中在两个不同的控制器上得到相同的集线器(我假设,因为两者都有相同的状态)?你得到的是上下文,而不是集线器。确切地说,上下文是单态的,对吗?这是否意味着,我拥有相同的对象(上下文),实例化一次,因此拥有相同的中心(瞬态)?这至少是我在控制器/主机服务中的行为。我有相同的单例和相同的集线器(状态)。ASP.NET核心有一个依赖注入框架,消除了对这个全局单例的需要。当从hub类外部调用hub方法时,没有与调用关联的调用方。因此,无法访问ConnectionId、Caller和Others属性。