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;