我试图在一个项目中使用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配置
{
分解器=分解器
});