Signalr 如何在ASP.NET内核中获取信号集线器上下文?

Signalr 如何在ASP.NET内核中获取信号集线器上下文?,signalr,signalr-hub,asp.net-core,Signalr,Signalr Hub,Asp.net Core,我正在尝试使用以下内容获取中心的上下文: var hubContext = GlobalHost.ConnectionManager.GetHubContext<SomeHub>(); 如果我添加Core的最新可用版本: "Microsoft.AspNet.SignalR.Server": "3.0.0-*", "Microsoft.AspNet.SignalR.Core" : "2.1.2" 由于服务器和核心相互冲突,我遇到了一大堆错误。如果我将它们都更改为使用版本“3.0.

我正在尝试使用以下内容获取中心的上下文:

var hubContext = GlobalHost.ConnectionManager.GetHubContext<SomeHub>();
如果我添加Core的最新可用版本:

"Microsoft.AspNet.SignalR.Server": "3.0.0-*",
"Microsoft.AspNet.SignalR.Core" :  "2.1.2"
由于服务器和核心相互冲突,我遇到了一大堆错误。如果我将它们都更改为使用版本“3.0.0-*”,所有冲突都会消失,但找不到GlobalHost。如果我删除服务器,只删除用户核心版本2.1.2,那么GlobalHost可以工作,但所有其他需要服务器的东西显然不能工作


有什么想法吗?

Microsoft.AspNet.signar.Infrastructure.IConnectionManager
是一种DI注入式服务,您可以通过它获取集线器上下文…例如:

使用Microsoft.AspNet.signal;
使用Microsoft.AspNet.signal.Infrastructure;
使用Microsoft.AspNet.Mvc;
公共类TestController:控制器
{
私有IHubContext测试中心;
公共测试控制器(IConnectionManager连接管理器)
{
testHub=connectionManager.GetHubContext();
}
.....

我需要能够从应用程序请求线程外部访问集线器上下文-因为我订阅了NServicebus消息,并且需要能够在收到消息时触发客户端功能

我是这样分类的:

公共静态IServiceProvider\uuuu服务提供商;
然后在启动配置期间

app.UseServices(服务=>
{
__serviceProvider=新的ServiceCollection()
.BuildServiceProvider(CallContextServiceLocator.Locator.ServiceProvider);
});
然后是vNext asp.net应用程序中的任何其他位置(任何其他线程)

var manager=Startup.\uu serviceProvider.GetRequiredService();
var hub=manager.GetHubContext();

希望这能有所帮助!

我在Startup.cs中添加了一些代码,以获取对ConnectionManager的引用,然后您可以使用它在代码中的任何位置、任何时间执行GetHubContext。与Nimo的答案类似,但有点不同,可能更简单

services.addSignaler(选项=>
{
options.Hubs.EnableDetailedErrors=true;
});
var provider=services.BuildServiceProvider();
//保留对connectionManager的引用
var connManager=provider.GetService(typeof(IConnectionManager))作为IConnectionManager;
//在其他地方使用它
var hub=connManager.GetHubContext();
不再存在于ASP.Net核心的信号器中。
我一直在使用
HubContext
访问中心

公共类HomeController:控制器
{
私有只读IHubContext\u hubContext;
公共家庭控制器(IHubContext hubContext)
{
_hubContext=hubContext;
}
public void SendToAll(字符串消息)
{
_hubContext.Clients.All.InvokeAsync(“发送”,消息);
}
}
我正在使用.NETCore2.0.0和Signalr1.0.0-alpha1-final


要在后台服务中使用集线器,除了控制器之外,还必须使用IHostedService接口并通过DI获取集线器

公共类MyBackgroundService:iHostService,IDisposable
{
公共静态IHubContext-HubContext;
公共MyBackgroundService(IHubContext-hubContext)
{
HubContext=HubContext;
}
公共任务StartSync(CancellationToken CancellationToken)
{
//TODO:您的启动逻辑、一些计时器、单例等
返回Task.CompletedTask;
}
公共任务StopAsync(CancellationToken CancellationToken)
{
//TODO:你的停止逻辑
返回Task.CompletedTask;
}
公共空间处置()
{
}
}
然后,您可以从HubContext静态字段的代码中的任意位置调用hub:

MyBackgroundService.HubContext.Clients.All.sendsync(“UpdateData”,myData.Wait();
了解有关IHostedService的更多信息:


您可以在MyBackgroundService中创建并启动计时器,并在ElapseEvent中调用集线器。

这在RC1中可用,但在RC2中不起作用(我得到错误)-你知道如何修复它吗?嗨,你从哪里得到这些信息的。我在几个小时的搜索后找不到文档。谢谢..你怎么能在其他地方找到connManager?你不需要注入或引用它吗,因为它不是静态的吗?从最新版本0.0.2-alpha1-21709开始,这种技术不再有效。我创建了一个静态变量f或startup类中的IConnectionManager。当它在另一个类中引用时,IHubContext可用,但hub.Clients.All.SendMessage(“foo”)不向客户端发送消息。@BillShihara-您解决了这里提到的问题吗?中提供的当前解决方案解决了一个类似的问题。您好!您可以发布一个如何在IoC容器中注册HubContext类的示例吗?@AndrewNikolin,不需要注册
HubContext
。只需在
Configur中介绍您的Hub即可e
method.
app.usesigner(routes=>{routes.MapHub(“live”);})
l按
services.addsignal()思考;
HubContext将自动注册…谢谢,这帮助很大。但是我如何从控制器外部访问
HubContext
呢?有没有办法也从静态上下文调用hub方法?@lenniep
HubContext
可以在
IServiceProvider
可用的任何地方访问。您可以访问
IServiceProvider
在静态类中使用一些技巧和技巧,但它根本不推荐使用。对于.net 5,请等待_hubContext.Clients.all.SendAsync(“yourmethod”,yourparameters”);非常感谢。这正是我需要做的,以使信号器从后台(hangfire)作业中工作
"Microsoft.AspNet.SignalR.Server": "3.0.0-*",
"Microsoft.AspNet.SignalR.Core" :  "2.1.2"