gpt4 book ai didi

asp.net - SignalR + Autofac + OWIN : Why doesn't GlobalHost. ConnectionManager.GetHubContext 工作?

转载 作者:行者123 更新时间:2023-12-03 09:26:32 27 4
gpt4 key购买 nike

我正在尝试在一个项目中使用 OWIN、SignalR 和 Autofac。

我正在对 signalR 进行如下设置:

       // 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 集成时,我无法再在服务器上获取 signalR Hub 上下文(例如在 webapi Controller 中),因此无法从服务器端向连接的客户端发送消息。当我不使用 Autofac signalR 集成时,如下所示是我如何执行此操作的:
var hubContext = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
hubContext.Clients.All.notification("Test Message");

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

如果我在对 MapSignalR 的调用中注释掉对 signalR 的依赖解析器的使用,对 GetHubContext 的调用将再次起作用,并且消息成功到达 signalR 客户端,但当然我不能再在集线器上使用 IoC。例如
        // Configure SignalR with the dependency resolver.
app.MapSignalR(new HubConfiguration
{
// Resolver = new AutofacDependencyResolver(container)
});

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

注意:我尝试过的另一件事不是使用 GlobalHost.ConnectionManager.GetHubContext() 我尝试将 IConnectionManager 注入(inject)我想从中向客户端发送消息的 webapi Controller ,然后调用 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 - SignalR + Autofac + OWIN : Why doesn't GlobalHost. ConnectionManager.GetHubContext 工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21126624/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com