我有一个使用许多类库(可选插件)的解决方案。它实际上与nopCommerce在设计上非常相似。无论如何,我有以下界面:
public interface IOwinStartupConfiguration
{
void Configuration(IAppBuilder app);
}
显然,在Web项目的Startup
类中,我得到了所有插件中所有已注册IOwinStartupConfiguration
个实例的列表,然后继续迭代每个插件。
到目前为止,我只有一个使用此插件的插件,但可能会在以后更改。我担心的是可能有超过1个插件调用类似的东西:
app.MapSignalR();
根据此页面:
http://www.asp.net/signalr/overview/testing-and-debugging/troubleshooting
这样做会导致像
这样的错误“名为'signalr.hubs'的路线已经在路线集中”
是否有可能看到OWIN管道中的内容?
理想情况下,我想做这样的事情:
if (!app.IsSignalRMapped)
{
app.MapSignalR();
}
或
if (!app.HasMappedService("SignalR"))
{
app.MapSignalR();
}
显然我在IAppBuilder
界面上找不到任何此类内容。那么在这种情况下我该怎么办?
答案 0 :(得分:0)
我偶然发现了MapWhen()
,但这似乎有点无意义。我打算尝试这样的事情:
app.MapWhen(x => !existingConfigurations.Contains("SignalR"), x => app.MapSignalR());
其中existingConfigurations
是在修改后的方法中传递的新ICollection<string>
:
void Configuration(IAppBuilder app, ICollection<string> existingConfigurations)
然而,我发现简单地做这件事更有意义:
if (!existingConfigurations.Contains("SignalR"))
{
app.MapSignalR();
existingConfigurations.Add("SignalR");
}
这不是一个完美的解决方案,因为有人可能会拼错“SignalR”,例如。但由于没有IsSignalRMapped()
方法,它必须足够。
答案 1 :(得分:0)
我没试过,但这可能有用:
var hub = GlobalHost.ConnectionManager.GetHubContext<MySignalRHub>();
if (hub == null)
{
app.MapSignalR();
}