Signalr 信号器-OWIN-多个端点

Signalr 信号器-OWIN-多个端点,signalr,owin,startup,Signalr,Owin,Startup,我有一个这样的场景 派生模块的基类。 每个模块都有自己的信号集线器。 我想在单个主机中承载所有模块,并用模块名称分隔。 某些模块将共享中心名称 namespace domain.com.base { public class BaseClass { public string ApplicationName; } } namespace domain.com.billing { public class Billing : BaseClass

我有一个这样的场景

派生模块的基类。
每个模块都有自己的信号集线器。
我想在单个主机中承载所有模块,并用模块名称分隔。
某些模块将共享中心名称

namespace domain.com.base
{
    public class BaseClass
    {
        public string ApplicationName;
    }
}

namespace domain.com.billing
{
    public class Billing : BaseClass
    {
        ApplicationName = "Billing";
    }
    public class NotificationHub : Hub
    {
        public void Credit(decimal amount)
        {
            Clients.All.Notify(amount);
        }
    }
}

namespace domain.com.reporting
{
    public class Reporting : BaseClass
    {
        ApplicationName = "Reporting";
    }
    public class ReportingHub : Hub
    {
        public Report GetReport(int Id)
        {
             return ReportModule.RetrieveReport(Id);
        }
    }
}
在OWIN.Startup.Configuration(IAppBuilder)中,是否可以执行类似的操作

namespace domain.com.external_access
{
    public void Configuration(IAppBuilder app)
    {
        var asmList = GlobalResolver.Applications();
        foreach(var asm in asmList)
        {
            app.MapSignalR(asm.ApplicationName,false);
        }
    }
}
实际上给了你这样的东西


实际上,这是可行的,即使它需要一些繁重的工作来解决信号器在
GlobalHost
周围的紧密耦合问题


下面的答案基于我的记忆,我现在无法访问我的代码。如果有错误,我会尽快更新答案

编辑:昨天晚上我做对了。照下面写的做


您需要实现自己的
IHubDescriptorProvider
IHubActivator
,以便控制为每个“端点”找到的
Hub
。此外,您需要为每个端点提供其自己的
HubConfiguration
(继承自
ConnectionConfiguration
)实例,该实例不使用全局主机依赖项解析程序。这可能是这样的:

class CustomSignalRConnectionConfiguration : HubConfiguration
{
    public CustomSignalRConnectionConfiguration() 
    {
        this.Resolver = new DefaultDependencyResolver();

        // configure your DI here...
        var diContainer = new YourFavouriteDi();

        // replace IHubActivator
        this.Resolver.Register(
            typeof(IHubActivator), 
            () => diContainer.Resolve<IHubActivator>());

        // replace  IHubDescriptorProvider
        this.Resolver.Register(
            typeof(IHubDescriptorProvider), 
            () => diContainer.Resolve<IHubDescriptorProvider>());

    }
}

祝你好运

您是否尝试过:
app.mapsigner(“/Reporting/signal”);app.mapsigner(“/Billing/signal”)?那太好了,但是,它不会在两个端点解析相同的集线器吗?谢谢!我一定会尝试实现这一点。让你知道!
app.Map("/endpointName", mappedApp => 
{   
    var config = new CustomSignalRConnectionConfiguration();
    mappedApp.MapSignalR(config);
});