【发布时间】: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