题:
有没有办法在ASP.NET MVC 6应用程序中将两个不同的路由(带有参数)分配给同一个控制器?
我试过了:
我尝试使用多个路由属性到控制器类和单个操作,没有工作.
笔记:
>我正在使用ASP.NET Core 1.0 RC1.
>我想这样做的原因是,我希望api与旧版本的使用旧网址的移动应用兼容.
例:
[Produces("application/json")] [Route("api/v2/Log")] /// The old route is "api/LogFile" which I want to be still valid for this controller. public class LogController : Controller { [HttpGet("{id}",Name = "download")] public IActionResult GetFile([FromRoute] Guid id) { // ... } }
在上面的例子中:api / LogFile / {some-guid}是旧路由,api / v2 / log / download / {some-guid}是新的路由.我需要两条路线调用相同的动作.
解决方法
在新的RC1应用程序中,控制器级别有两个路由属性可以正常工作:
[Produces("application/json")] [Route("api/[controller]")] [Route("api/old-log")] public class LogController: Controller { [HttpGet] public IActionResult GetAll() { return Json(new { Foo = "bar" }); } }
http:// localhost:62058 / api / log和http:// localhost:62058 / api / old-log返回预期的json.我看到的唯一注意事项是,您可能需要设置属性的名称/顺序属性,以防您需要为其中一个操作生成URL.
有2个属性的动作也可以:
[Produces("application/json")] public class LogController : Controller { [Route("api/old-log")] [Route("api/[controller]")] [HttpGet] public IActionResult GetAll() { return Json(new { Foo = "bar" }); } }
但是,在控制器级别和特定操作路线上设置一般路由时,您需要小心.在这些情况下,控制器级别的路由被用作前缀,并被添加到url(有关这个行为here的很好的文章).这可能会让您得到一组不同于您期望的URL,例如:
[Produces("application/json")] [Route("api/[controller]")] public class LogController : Controller { [Route("api/old-log")] [Route("")] [HttpGet] public IActionResult GetAll() { return Json(new { Foo = "bar" }); } }
在最后一种情况下,您的应用程序将侦听的2条路由将是http:// localhost:62058 / api / log和http:// localhost:62058 / api / log / api / old-log,因为api / log被添加为在动作级别定义的所有路由的前缀.
最后,另一个选择是为新路由使用属性,然后使用启动类中的路由表来提供照顾旧api的特定路由.