SignalR Hub 客户端无法在 SignalR 管道外正确解析
SignalR Hub Clients not resolving correctly outside SignalR pipeline
请帮忙,这让我发疯!
我的服务器 -> SignalR (JS) 客户端方法执行通过 SignalR 管道工作正常,但在通过后台服务调用时却不行。我正在使用 ASP.NET MVC / Castle Windsor DI
我使用在 Owin 启动期间注册的自定义依赖解析器
我观察到通过 NotificationHub(SignalR 管道),客户端被解析为 HubConnectionContext class:
但是,通过我的后台服务,客户端解析为 HubConnectionContextBase class:
...所以我很确定这是一个 DI 问题。我只是看不出我做错了什么。也将不胜感激调试的任何提示。谢谢
申请开始:
bootstrapper = ContainerBootstrapper.Bootstrap();
this.container = bootstrapper.Container;
var resolverSignalR = new DependencyResolverSignalR(container);
GlobalHost.DependencyResolver = resolverSignalR;
OwinConfig:
app.MapSignalR(url, DependencyResolverSignalR.CreateHubConfiguration());
DependencyResolverSignalR:
public class DependencyResolverSignalR : DefaultDependencyResolver
{
public static HubConfiguration CreateHubConfiguration()
{
var signalrDependencyResolver = new DependencyResolverSignalR(_container);
var configuration = new HubConfiguration {
EnableDetailedErrors = true,
Resolver = signalrDependencyResolver
};
return configuration;
}
private static IWindsorContainer _container;
public DependencyResolverSignalR(IWindsorContainer container)
{
if (container == null)
{
throw new ArgumentNullException(nameof(container));
}
_container = container;
}
public override object GetService(Type serviceType)
{
return _container.Kernel.HasComponent(serviceType) ? _container.Resolve(serviceType) : base.GetService(serviceType);
}
public override IEnumerable<object> GetServices(Type serviceType)
{
return _container.Kernel.HasComponent(serviceType) ? _container.ResolveAll(serviceType).Cast<object>() : base.GetServices(serviceType);
}
}
通知服务:
(每 10 秒通过一个循环运行 - 客户端连接后)
// Not working
var hubContext = GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();
var clients = hubContext.Clients;
clients.All.receiveMessage(testMessage);
通知中心:
public override Task OnConnected()
{
var connectionId = Context.ConnectionId;
...
...
// Working fine
base.Clients.All.receiveMessage(testMessage);
return base.OnConnected();
}
客户:
omitted since it works fine via the signalr pipeline
我希望通过 NotificationService 调用的 receiveMessage() 客户端方法在客户端上以与通过 SignalR 管道调用时完全相同的方式执行。相反虚无。没有错误消息,调用只是静静地执行任何操作。
我什至尝试按照此处的指南(尽管它面向 Ninject)SignalR document 直接解析客户端 (IHubConnectionContext)。结果完全一样。
代码:
var resolverSignalR = new DependencyResolverSignalR(container);
container.Register(Component
.For<IHubConnectionContext<dynamic>>()
.UsingFactoryMethod(() =>
resolverSignalR.Resolve<IConnectionManager().GetHubContext<NotificationHub>().Clients));
已解决!这是 HubConfiguration 的问题 - 我不确定具体是什么。但是绕过它(这是可能的,因为我已经在 Application_Start() 中替换了 DependencyResolver)解决了这个问题。
旧 OwinConfig:
app.MapSignalR(url, DependencyResolverSignalR.CreateHubConfiguration());
替换为:
app.MapSignalR();
但请确保在 Application_Start()(或任何初始化 DI 容器的地方)中有类似的内容
var resolverSignalR = new DependencyResolverSignalR(container);
GlobalHost.DependencyResolver = resolverSignalR;
请帮忙,这让我发疯!
我的服务器 -> SignalR (JS) 客户端方法执行通过 SignalR 管道工作正常,但在通过后台服务调用时却不行。我正在使用 ASP.NET MVC / Castle Windsor DI
我使用在 Owin 启动期间注册的自定义依赖解析器
我观察到通过 NotificationHub(SignalR 管道),客户端被解析为 HubConnectionContext class:
但是,通过我的后台服务,客户端解析为 HubConnectionContextBase class:
...所以我很确定这是一个 DI 问题。我只是看不出我做错了什么。也将不胜感激调试的任何提示。谢谢
申请开始:
bootstrapper = ContainerBootstrapper.Bootstrap();
this.container = bootstrapper.Container;
var resolverSignalR = new DependencyResolverSignalR(container);
GlobalHost.DependencyResolver = resolverSignalR;
OwinConfig:
app.MapSignalR(url, DependencyResolverSignalR.CreateHubConfiguration());
DependencyResolverSignalR:
public class DependencyResolverSignalR : DefaultDependencyResolver
{
public static HubConfiguration CreateHubConfiguration()
{
var signalrDependencyResolver = new DependencyResolverSignalR(_container);
var configuration = new HubConfiguration {
EnableDetailedErrors = true,
Resolver = signalrDependencyResolver
};
return configuration;
}
private static IWindsorContainer _container;
public DependencyResolverSignalR(IWindsorContainer container)
{
if (container == null)
{
throw new ArgumentNullException(nameof(container));
}
_container = container;
}
public override object GetService(Type serviceType)
{
return _container.Kernel.HasComponent(serviceType) ? _container.Resolve(serviceType) : base.GetService(serviceType);
}
public override IEnumerable<object> GetServices(Type serviceType)
{
return _container.Kernel.HasComponent(serviceType) ? _container.ResolveAll(serviceType).Cast<object>() : base.GetServices(serviceType);
}
}
通知服务: (每 10 秒通过一个循环运行 - 客户端连接后)
// Not working
var hubContext = GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();
var clients = hubContext.Clients;
clients.All.receiveMessage(testMessage);
通知中心:
public override Task OnConnected()
{
var connectionId = Context.ConnectionId;
...
...
// Working fine
base.Clients.All.receiveMessage(testMessage);
return base.OnConnected();
}
客户:
omitted since it works fine via the signalr pipeline
我希望通过 NotificationService 调用的 receiveMessage() 客户端方法在客户端上以与通过 SignalR 管道调用时完全相同的方式执行。相反虚无。没有错误消息,调用只是静静地执行任何操作。
我什至尝试按照此处的指南(尽管它面向 Ninject)SignalR document 直接解析客户端 (IHubConnectionContext)。结果完全一样。
代码:
var resolverSignalR = new DependencyResolverSignalR(container);
container.Register(Component
.For<IHubConnectionContext<dynamic>>()
.UsingFactoryMethod(() =>
resolverSignalR.Resolve<IConnectionManager().GetHubContext<NotificationHub>().Clients));
已解决!这是 HubConfiguration 的问题 - 我不确定具体是什么。但是绕过它(这是可能的,因为我已经在 Application_Start() 中替换了 DependencyResolver)解决了这个问题。
旧 OwinConfig:
app.MapSignalR(url, DependencyResolverSignalR.CreateHubConfiguration());
替换为:
app.MapSignalR();
但请确保在 Application_Start()(或任何初始化 DI 容器的地方)中有类似的内容
var resolverSignalR = new DependencyResolverSignalR(container);
GlobalHost.DependencyResolver = resolverSignalR;