C# OWIN无法使用webapp.start单独运行多个应用

C# OWIN无法使用webapp.start单独运行多个应用,c#,asp.net,asp.net-web-api,owin,attributerouting,C#,Asp.net,Asp.net Web Api,Owin,Attributerouting,当我尝试在不同的url上启动两个应用程序时,我发现属性路由中间件有问题。如果我在不同的应用程序中有两个类似的路由,但使用不同的http方法,那么web.api似乎只能找到其中一个方法 Microsoft.Owin.Hosting.WebApp.Start<Admin.Startup>("http://localhost:1000"); Microsoft.Owin.Hosting.WebApp.Start<Startup>("http://localhost:1001")

当我尝试在不同的url上启动两个应用程序时,我发现属性路由中间件有问题。如果我在不同的应用程序中有两个类似的路由,但使用不同的http方法,那么web.api似乎只能找到其中一个方法

Microsoft.Owin.Hosting.WebApp.Start<Admin.Startup>("http://localhost:1000");
Microsoft.Owin.Hosting.WebApp.Start<Startup>("http://localhost:1001");
Microsoft.Owin.Hosting.WebApp.Start(“http://localhost:1000");
Microsoft.Owin.Hosting.WebApp.Start(“http://localhost:1001");

如何隔离这两个应用程序,使属性路由不冲突?

根据您最后的评论,下面的示例将筛选出程序集:

config.Services.Replace(typeof(IAssembliesResolver), new CustomAssembliesResolver());

公共类CustomAssembliesResolver:DefaultAssembliesResolver
{
公共重写ICollection getAssemblys()
{
ICollection defaultProbedAssemblies=base.GetAssemblies();
//TODO:筛选出不希望探测的程序集
返回DefaultProbedAssembly;
}
}

我遇到了完全相同的问题,@KiranChalla的回答让我走上了正确的道路(谢谢!)。问题确实在于程序集扫描的深度超出了我的预期。对我来说,我一直希望扫描只包括定义了“当前”启动的程序集,因为这是所有相关控制器所在的Web API项目。我创建了一个始终只返回一个程序集的解析程序:

public class SingleAssemblyResolver : IAssembliesResolver
{
    private readonly Assembly _ass;

    public SingleAssemblyResolver(Assembly ass) {
        _ass = ass;
    }

    public ICollection<Assembly> GetAssemblies() {
        return new[] { _ass };
    }
}

嗯,你的请求uri是什么样子的?每个应用程序中有两个独立的控制器,都有一个路由前缀。使用~这两个控制器是同一程序集的一部分吗?对前缀的重写,一个操作与另一个操作相同?属性路由尝试扫描引用程序集中的所有控制器,以查找属性化的控制器/操作…以及您看到的问题(404、500或其他)以及您的控制器和请求的外观。我们需要此附加信息来了解您的问题…webapps位于不同的项目/程序集中。启动它们的代码位于第三个程序集中。我得到404。如果控制器在完全不同的程序集中,那么应该不会有任何问题…如果第三个程序集引用了其他2个程序集,那么所有3个程序集都将被探测属性路由。。。
public class SingleAssemblyResolver : IAssembliesResolver
{
    private readonly Assembly _ass;

    public SingleAssemblyResolver(Assembly ass) {
        _ass = ass;
    }

    public ICollection<Assembly> GetAssemblies() {
        return new[] { _ass };
    }
}
config.Services.Replace(typeof(IAssembliesResolver),
    new SingleAssemblyResolver(this.GetType().Assembly));