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

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

       // Create the AutoFac container builder:
        var builder = new ContainerBuilder();

        // ...[Register various other things in here]...

        // register signalR Hubs
        builder.RegisterHubs(Assembly.GetExecutingAssembly());

        // Build the container:
        var container = builder.Build();

        // Configure SignalR with the dependency resolver.
        app.MapSignalR(new HubConfiguration
        {
            Resolver =  new AutofacDependencyResolver(container)
        });

我的问题是,当我使用Autofac SignalR集成时,我无法再在服务器上(例如在WebAPI控制器中)获得SignalR Hub上下文,因此无法从服务器端向连接的客户端发送消息.当我不使用Autofac SignalR集成时,我是如何做到这一点的,如下所示:

var hubContext = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
hubContext.Clients.All.notification("Test Message");

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

如果我注释掉在对MapSignalR的调用中使用SignalR的依赖项解析器,则对GetHubContext的调用会再次工作,消息会成功到达SignalR客户端,但当然我不能再在集线器上使用IoC.例如:

        // Configure SignalR with the dependency resolver.
        app.MapSignalR(new HubConfiguration
        {
            // Resolver =  new AutofacDependencyResolver(container)
        });

Can anybody tell me why using the AutofacDependencyResolver stops GlobalHost.ConnectionManager.GetHubContext from working correctly??

注意:我try 过的另一件事是不使用GlobalHost.连接管理器.GetHubContext()我try 将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 = new AutofacDependencyResolver(container);
IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<MyHub>();

// A custom HubConfiguration is now unnecessary, since MapSignalR will
// use the resolver from GlobalHost by default.
app.MapSignalR();

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

IDependencyResolver resolver = new AutofacDependencyResolver(container);
IHubContext hubContext = resolver.Resolve<IConnectionManager>().GetHubContext<MyHub>();

app.MapSignalR(new HubConfiguration
{
    Resolver = resolver
});

Asp.net相关问答推荐

我可以在一个 Web 项目中有多个 web.config 文件吗?

判断 asp.net mvc 4 应用程序中的 ssl 协议、密码和其他属性

IIS Request.UserHostAddress 返回 IPV6 (::1),即使禁用了 IPV6

使用会话变量有多安全 - asp.net / c#

如何在页面的基类中执行 Page_Load()?

如何确定 web.config 中的编译 debug="true"

在每个控制器的 ASP.NET WebAPI 上强制使用 CamelCase

在使用网络服务器加载它们之前,如何编译 Asp.Net Aspx 页面?

如何在 ASP.NET 中仅在调试模式下执行代码

如何在 ASP.NET MVC3 中配置区域

LINQ to Entities 无法识别 MVC 4 中的System.String ToString()方法

带有完整内存错误的 WCF 服务(内存门判断失败,因为可用内存) - 如何解决

使用 JObject 所需的库名称是什么?

如何从 Asp.net Mvc-3 发送邮箱?

实体框架:如何解决外键约束可能导致循环或多个级联路径?

如何判断用户代理是 ipad 还是 iphone?

IIS Express - 增加内存限制

如何在 ASP.NET 中通过 LAN 访问您的网站

如何将列表转换为数据表

将 HTML 字符串转换为图像