【问题标题】:ASP.NET WebAPI Attribute Routing on Duplicate Class Names重复类名上的 ASP.NET WebAPI 属性路由
【发布时间】:2014-08-14 15:25:40
【问题描述】:

我在尝试对我正在处理的 API 之一进行版本控制时遇到了这个问题。

我有 2 个名称相同的控制器,它们位于不同的命名空间中并映射到不同的路由。当我尝试去他们的不同路线时,我收到错误No HTTP resource was found that matches the request URI

这是一个代码示例:

namespace MvcApplication
{
    public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            GlobalConfiguration.Configure(WebApiConfig.Register);
        }
    }
}

namespace MvcApplication
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.MapHttpAttributeRoutes();
            config.EnsureInitialized();
        }
    }
}

namespace MvcApplication.Controllers.v1
{
    [RoutePrefix("api/v1/values")]
    public class ValuesController : ApiController
    {
        [HttpGet]
        [Route("")]
        public IHttpActionResult GetValues()
        {
            return Ok(new string[] { "value1", "value2" });
        }
    }
}

namespace MvcApplication.Controllers.v2
{
    [RoutePrefix("api/v2/values")]
    public class ValuesController : ApiController
    {
        [HttpGet]
        [Route("")]
        public IHttpActionResult GetValues()
        {
            return Ok(new string[] { "value3", "value4" });
        }
    }
}

如果我更改类名以使它们不相同(例如 ValuesControllerV1ValuesControllerV2),一切都会按预期工作。

无论如何要保持相同的类名并按预期解决问题?

编辑:更新以显示初始化代码。

【问题讨论】:

  • 在这种情况下是否注册了任何路由?还是两者都得到No HTTP resource was found that matches the request URI
  • 问题:是否启用了属性路由?
  • 是的,属性路由已启用。如果我只是更改类的名称,一切正常。
  • @James 默认路由已就位并且运行良好。我已将它们全部删除以更具体地适合此示例。即使只是简单地更改类名也可以使路由正常工作。
  • 看到这个answer

标签: c# asp.net asp.net-web-api attributerouting


【解决方案1】:

在 MVC 中,您可以使用具有命名空间参数的 MapRoute 重载。像这样的:

routes.MapRoute(
     "Route for v1", // Route name
     "areav1/{controller}/{action}/{id}", // URL with parameters
     new { controller = "Values", action = "GetValues", id = UrlParameter.Optional },           new string[] { "MvcApplication.Controllers.v1"}
);

routes.MapRoute(
     "Route for v2", // Route name
     "areav2/{controller}/{action}/{id}", // URL with parameters
     new { controller = "Values", action = "GetValues", id = UrlParameter.Optional },           new string[] { "MvcApplication.Controllers.v2"}
);

不幸的是,这还没有在 WebApi 中实现。

Here is a thread about this problem specifically:

【讨论】:

  • Web Api 不使用MapRoute 所以namepsace 参数不可用。
猜你喜欢
  • 1970-01-01
  • 2023-03-12
  • 2016-12-17
  • 1970-01-01
  • 2014-05-02
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多