ASP.基于重复类名的.NET WebAPI属性路由

本文关键字:NET WebAPI 属性 路由 于重复 ASP | 更新日期: 2023-09-27 18:18:13

我在尝试我正在工作的api的一个版本时遇到了这个问题。

我有两个命名相同的控制器,它们位于不同的命名空间中,并且映射到不同的路由。当我尝试去他们不同的路由时,我得到错误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),一切工作如预期。

是否有办法保持相同的类名并按预期的方式解决问题?

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

ASP.基于重复类名的.NET WebAPI属性路由

在MVC中,你可以使用带有命名空间参数的MapRoute Overload。像这样:

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中实现。

这里有一个关于这个问题的线程: