【问题标题】:ASP.NET Web API with MVC: Attribute routes ignored in class libraries带有 MVC 的 ASP.NET Web API:类库中忽略的属性路由
【发布时间】:2014-09-05 21:16:02
【问题描述】:

我正在开发一个使用插件的 MVC 应用程序。我需要支持从这些插件中使用 Web API。我让它工作(包括使用 Autofac 的依赖注入)。但是,类库(插件或任何其他程序集)似乎完全忽略了属性路由。例如,我有一个这样指定的测试插件:

[RoutePrefix("api/cms/test")]
    public class TestController : ApiController
    {

浏览到 /api/cms/test 时出现以下错误:

“未找到与请求 URI '[my site]:30863/api/cms/test' 匹配的 HTTP 资源。未找到与名为 'cms' 的控制器匹配的类型。”

当我删除“cms”时,它会起作用,因为它使用的是默认路由。显然这还不够,因为我很可能会有多个具有相同名称的控制器(在不同的程序集中),因此需要到每个控制器的唯一路由。

我也检查了System.Web.Http.GlobalConfiguration.Configuration.Routes 中的路线集合以确认路线确实丢失了。

有没有人可以告诉我为什么属性路由被类库忽略以及是否有解决方法?

编辑

感谢 Kiran 对 Route 属性的评论;我确实注意到了我的错误,因为忘记了控制器上的 [Route("")] 属性,该属性将与 [RoutePrefix] 属性一起使用。我添加了这一点,现在属性路由工作正常。但是,我仍然不能有 2 个具有相同名称的控制器,即使它们位于不同的程序集中。在做了一些研究之后,这似乎是一个已知问题——不仅仅是不同的程序集,而是不同的命名空间。我试图从这里实现一个解决方案:

http://shazwazza.com/post/multiple-webapi-controllers-with-the-same-name-but-different-namespaces/

问题在于现在DataTokens 为空且只读!所以它不再是解决这个问题的可行方案。希望其他人能解决这个问题。

编辑 2

感谢 Kiran 提到路线限制。但是,这仍然不能解决我的问题。我正在寻找的是一种允许多个控制器具有相同名称的方法,无论它们位于不同的区域、不同的命名空间还是两者兼而有之.. 无论如何.. 问题在于底层 Web API 实现使用名称查找控制器一个IDictionary<string, HttpControllerDescriptor> 变量来存储这些信息。如果您查看DefaultHttpControllerSelector 的源代码,您可以看到这一点。所以,起初我想也许我只需要继承这个类并覆盖GetControllerMapping(),因为内部类中的调用代码AttributeRoutingMapper根本不关心那个字典中的键......它只看价值。所以起初我想我可以覆盖它并使用控制器的全名(包括命名空间)作为键,这样我们就可以把它们都放在那里。然而,这并不容易.. 有几个原因,其中最重要的原因是 AttributeRoutingMapper 并不是唯一调用 GetControllerMapping() 的类。

因此,要完成我需要完成的工作似乎需要做很多工作;如果有可能的话。我将开始赏金; 100 分给任何可以提供完整工作解决方案或可以提供足够信息让我自己开始解决方案的人。

【问题讨论】:

    标签: asp.net-mvc asp.net-web-api asp.net-web-api2


    【解决方案1】:

    从错误消息中,看起来路由的顺序不正确...看起来您的请求与常规路由匹配(例如:api/{controller})而不是属性路由...如您所知路由顺序很重要...所以请确保在常规路线之前注册属性路线,因为它们更具体...

    还要注意RoutePrefix 属性本身不会将路由添加到路由表中,但Route 属性会...

    我猜您是在 IIS 中托管您的应用程序?

    【讨论】:

    • +1 获取关于 [Route] 的注释。谢谢。请看我上面的编辑。
    • 一般来说,Web API 本身并不支持跨命名空间的相同控制器名称...您需要为您的控制器使用不同的名称...使用此方法的示例:aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/…跨度>
    • 谢谢,基兰。这个问题并没有真正使 Web API 成为一个很好的、可插入的体系结构……我会看看你发送的那个链接,看看我是否可以做任何定制来解决这个问题。谢谢。
    • 我查看了路线限制,但不幸的是,这并不能满足我的需要。这允许 2 个控制器具有相同的路由。如果您在发送的链接中使用该示例并将控制器移动到不同的文件夹并将它们重命名为具有相同的名称,则该示例不再起作用。我需要的是有 2 个同名的控制器;不是 2 个具有相同路由的控制器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    • 2017-06-04
    • 2019-05-10
    • 1970-01-01
    相关资源
    最近更新 更多