【问题标题】:Webapi DefaultHttpControllerSelector does not properly resolve my controllerWebapi DefaultHttpControllerSelector 无法正确解析我的控制器
【发布时间】:2013-05-08 00:00:29
【问题描述】:

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

我已经看到 AutofacControllerFactory 曾经存在,甚至还有一个注册它的 ConfigureWebApi,但它不再存在于默认分支中。(你可以在这里看到它http://alexmg.com/post/2012/03/09/Autofac-ASPNET-Web-API-(Beta)-Integration.aspx

似乎我们也无法过滤WebApi中路由定义的命名空间(MVC可以)。

那么,关于如何仅使用在我的 Autofac 容器中注册的控制器而不使用似乎扫描所有引用的程序集以发现控制器的 DefaultHttpControllerSelector 有什么想法吗?

谢谢

【问题讨论】:

    标签: asp.net-web-api autofac


    【解决方案1】:

    问题是用 autofac 注册控制器与路由过程并没有真正的关系。只有当路由进程确定了要分派到哪个控制器时,才会调用 Autofac 来解析类型。 看起来,从源代码中挖掘,您需要编写一个替换 IHttpControllerSelector 以处理具有相同名称的两个控制器。 (顺便说一句,这真的很糟糕)。
    您可能可以将DefaultHttpControllerTypeResolver 替换为一个实例,该实例传递了一个谓词,该谓词从您要忽略的程序集中过滤掉控制器。这是一个有点笨拙的解决方案,但可能会奏效。

    实际上,您可以将 DefaultHttpControllerTypeResolver 完全替换为基于 Autofac 容器中注册的解析器。这是一个非常简单的接口,所以只要 Autofac 有某种发现机制,你就应该是黄金。

       public interface IHttpControllerTypeResolver
        {
          ICollection<Type> GetControllerTypes(IAssembliesResolver assembliesResolver);
        }
    

    【讨论】:

    • 它有效。不确定我是否能够做出最好的 HttpControllerTypeResolver 但它解决了我的问题。我一直在努力在 autofac 容器中列出所有控制器寄存器。
    • @Dave:分享您的实际解决方案将是一个巧妙的举措;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 2013-04-11
    • 2015-04-16
    • 2015-03-06
    • 1970-01-01
    • 2016-07-21
    • 2016-01-21
    相关资源
    最近更新 更多