signal+Autofac+OWIN:为什么GlobalHost.ConnectionManager.GetHubContext不能工作?

我试图在一个项目中使用OWIN、SignalR和Autofac

我正在对信号机进行如下设置:

//创建AutoFac容器生成器:
var builder=new ContainerBuilder();
//…[在此处注册各种其他内容]。。。
//寄存器信号器集线器
registerUBS(Assembly.getExecutionGassembly());
//构建容器:
var container=builder.Build();
//使用依赖项解析程序配置信号器。
应用程序MapSignalR(新HUB配置
{
解析程序=新的AutofacDependencyResolver(容器)
});

我的问题是,当我使用Autofac SignalR集成时,我无法再在服务器上获得SignalR Hub上下文(例如在webapi控制器中),因此无法从服务器端向连接的客户端发送消息。以下是我在不使用Autofac信号机集成时的操作方式:

var hubContext=GlobalHost.ConnectionManager.GetHubContext<MyHub>();
hubContext.Clients.All.notification(“测试消息”);

但是,当我将Autofac添加到混合中时,这不起作用-我没有收到任何错误消息,而且我确实似乎得到了hubContext,但是对它的调用实际上似乎没有到达客户端

如果我在调用MapSignalR时注释掉对signalR的依赖解析程序的使用,那么对GetHubContext的调用将再次工作,消息将成功地到达signalR客户端,但我当然不能再在集线器上使用IoC。e、 g

//使用依赖项解析器配置信号器。
应用程序MapSignalR(新HUB配置
{
//解析程序=新的AutofacDependencyResolver(容器)
});

有人能告诉我为什么使用AutofacDependencyResolver会阻止GlobalHost.ConnectionManager.GetHubContext正常工作吗??

注意:我尝试过的另一件事是,我没有使用GlobalHost.ConnectionManager.GetHubContext(),而是尝试将IConnectionManager注入我想要向客户端发送消息的webapi控制器,然后调用GetHubContext,但Autofac无法解析IConnectionManager

我确实找到了Piotr Szmyd的以下文章,这篇文章显然允许这样做:

http://www.szmyd.com.pl/blog/wiring-signalr-with-autofac

但这似乎是基于过时的signalR构建,虽然这里似乎有一个nuget包:

http://www.nuget.org/packages/SignalR.AutoFac/

它似乎也已经过时了

如果将自定义依赖项解析程序与SignalR一起使用,则不能再使用GlobalHost,除非对其进行修改:

GlobalHost.DependencyResolver=新的AutofacDependencyResolver(容器);
IHubContext=GlobalHost.ConnectionManager.GetHubContext<MyHub>();
//现在不需要自定义HUB配置,因为MapSignal将
//默认情况下,使用GlobalHost中的冲突解决程序。
app.mapsigner();

如果不想修改GlobalHost,则必须手动解析IConnectionManager:

IDependencyResolver解析器=新的AutofacDependencyResolver(容器);
IHubContext hubContext=resolver.Resolve<IConnectionManager>()GetHubContext<MyHub>();
应用程序MapSignalR(新HUB配置
{
分解器=分解器
});

发表评论