Asp.net web api Webapi DefaultHttpControllerSelector未正确解析我的控制器

Asp.net web api Webapi DefaultHttpControllerSelector未正确解析我的控制器,asp.net-web-api,autofac,Asp.net Web Api,Autofac,我有一个WebApi应用程序,其中包含一些控制器(它们是使用扩展方法RegisterAppControllers注册的)。此应用程序引用另一个程序集,该程序集包含我不想公开的其他控制器(我已检查它们是否未在容器中注册)。碰巧两者都有一个OrderController,当我尝试访问/api/Order url时,我得到一个异常“找到了多个与名为“Order”的控制器匹配的类型”,堆栈跟踪显示我在DefaultHttpControllerSelector中 我已经看到AutofacControlle

我有一个WebApi应用程序,其中包含一些控制器(它们是使用扩展方法RegisterAppControllers注册的)。此应用程序引用另一个程序集,该程序集包含我不想公开的其他控制器(我已检查它们是否未在容器中注册)。碰巧两者都有一个OrderController,当我尝试访问/api/Order url时,我得到一个异常“找到了多个与名为“Order”的控制器匹配的类型”,堆栈跟踪显示我在DefaultHttpControllerSelector中

我已经看到AutofacControllerFactory曾经存在,甚至有一个ConfigureWebApi注册了它,但它不再出现在默认分支中。(您可以在这里看到)

我们似乎也不能在WebApi中过滤路由定义的名称空间(MVC也是可能的)

那么,您知道如何只使用在Autofac容器中注册的控制器,而不使用似乎扫描所有引用程序集以发现控制器的DefaultHttpControllerSelector吗


谢谢

问题在于,向autofac注册控制器与路由过程实际上并不相关。只有在路由过程确定要分派给哪个控制器后,才会调用Autofac来解析该类型。 从源代码中挖掘出来,似乎需要编写一个替换的
IHttpControllerSelector
,以便处理两个同名控制器。(顺便说一句,这真是糟透了)。
您可以将
DefaultHttpControllerTypeResolver
替换为一个实例,该实例被传递一个谓词,该谓词从要忽略的程序集中过滤出控制器。这是一个有点笨拙的解决方案,但可能会奏效

实际上,您可以完全使用基于Autofac容器中的注册的HttpControllerTypeResolver替换DefaultHttpControllerTypeResolver。这是一个非常简单的界面,所以只要Autofac有某种发现机制,您就应该是黄金

   public interface IHttpControllerTypeResolver
    {
      ICollection<Type> GetControllerTypes(IAssembliesResolver assembliesResolver);
    }
公共接口IHttpControllerTypeResolver
{
ICollection GetControllerTypes(IAssembliesResolver assembliesResolver解析器);
}

它可以工作。我不确定我是否能够制作出最好的HttpControllerTypeResolver,但它解决了我的问题。我一直在努力列出autofac容器中的所有控制器寄存器。@Dave:共享您的实际解决方案将是一个巧妙的举动;)