SignalR - OWIN - 多个端点
SignalR - OWIN - Multiple endpoints
我有这样的场景。
一个基础 class 模块派生自。
每个模块都有自己的信号集线器。
我想将所有模块托管在一个主机中,以模块名称分隔。
一些模块将共享集线器名称。
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);
}
}
}
有效地给你这样的东西......
http://domain.com.external_access/Reporting/hubs
http://domain.com.external_access/Billing/hubs
实际上这是可行的,即使它需要一些繁重的工作来解决 SignalR 在 GlobalHost
周围的紧密耦合。
下面的答案是基于我所记得的,我现在无法访问我的代码。如果有错误,我会尽快更新答案。
编辑:昨天晚上我做对了。按照下面写的去做
您需要实现自己的 IHubDescriptorProvider
和 IHubActivator
,以便控制为每个 "endpoints" 找到哪些 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.Map("/endpointName", mappedApp =>
{
var config = new CustomSignalRConnectionConfiguration();
mappedApp.MapSignalR(config);
});
祝你好运!
我有这样的场景。
一个基础 class 模块派生自。
每个模块都有自己的信号集线器。
我想将所有模块托管在一个主机中,以模块名称分隔。
一些模块将共享集线器名称。
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);
}
}
}
有效地给你这样的东西......
http://domain.com.external_access/Reporting/hubs http://domain.com.external_access/Billing/hubs
实际上这是可行的,即使它需要一些繁重的工作来解决 SignalR 在 GlobalHost
周围的紧密耦合。
下面的答案是基于我所记得的,我现在无法访问我的代码。如果有错误,我会尽快更新答案。
编辑:昨天晚上我做对了。按照下面写的去做
您需要实现自己的 IHubDescriptorProvider
和 IHubActivator
,以便控制为每个 "endpoints" 找到哪些 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.Map("/endpointName", mappedApp =>
{
var config = new CustomSignalRConnectionConfiguration();
mappedApp.MapSignalR(config);
});
祝你好运!