是否有可能看到OWIN的IAppBuilder注册了什么?

时间:2016-02-03 11:50:30

标签: asp.net-mvc signalr owin

我有一个使用许多类库(可选插件)的解决方案。它实际上与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界面上找不到任何此类内容。那么在这种情况下我该怎么办?

2 个答案:

答案 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();
}