在ASP MVC 6中为同一个控制器或操作分配多个路由

A-S*_*ani 35 asp.net asp.net-core-mvc asp.net-core

题:

有没有办法将两个不同的路由(带参数)分配给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) 
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的示例中:api/LogFile/{some-guid}是旧路由,api/v2/log/download/{some-guid}是新路由.我需要两个路由调用相同的动作.

Dan*_*.G. 60

在控制器级别有2个路由属性在新的RC1应用程序中正常工作:

[Produces("application/json")]
[Route("api/[controller]")]
[Route("api/old-log")]
public class LogController: Controller
{
    [HttpGet]
    public IActionResult GetAll()
    {
        return Json(new { Foo = "bar" });
    }
}
Run Code Online (Sandbox Code Playgroud)

两者http://localhost:62058/api/loghttp://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" });
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,在控制器级别和特定操作路径上具有常规路径时需要小心.在这种情况下,在控制器级别的路线作为前缀和前置到URL(有一个关于此行为的好文章在这里).这可能会为您提供一组不同于您期望的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" });
    }
}
Run Code Online (Sandbox Code Playgroud)

在2路,你的应用程序将在最后一种情况下听会http://localhost:62058/api/log,并http://localhost:62058/api/log/api/old-log因为api/log添加的前缀,在操作级别定义的所有路由.

最后,另一种选择是使用新路由的属性,然后使用启动类中的路由表来提供处理旧api的特定路由.

  • 我现在明白了,因为 url 的初始部分是不同的,我猜你从控制器中删除了属性并在操作上使用了 2 个属性 (2认同)