asp.net – 在ASP MVC 6中为多个路由分配给同一个控制器或者动作

前端之家收集整理的这篇文章主要介绍了asp.net – 在ASP MVC 6中为多个路由分配给同一个控制器或者动作前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
题:

有没有办法在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的特定路由.

猜你在找的asp.Net相关文章