ASP.NET核心属性路由

Wil*_*ski 7 c# asp.net-core asp.net-core-2.0 asp.net-core-routing

我正在将项目迁移到ASP Net Core,但是我无法配置这些路由,因为我使用属性来映射操作。

ASP.Net WebAPI2的代码

[Route("api/[controller]")]
public class SalesController : Controller
{
    // api/sales/1 -> ok
    [HttpGet]
    public HttpResponseMessage Get(int id)
    {
        // Logic
    }   

    // api/sales -> ok
    [HttpGet]
    public HttpResponseMessage Get([FromUri] PaginationHelper pagination)
    {
        // Logic
    }  

    // api/sales?me -> ok
    [ActionName("Get")]
    public HttpResponseMessage GetMe(bool? me)
    {
        // Logic
    }  
}
Run Code Online (Sandbox Code Playgroud)

ASP.Net Core的代码

在文件Startup.cs中设置app.UseMvc();。

[Route("api/[controller]")]
public class SalesController : Controller
{
    // api/sales/1 -> ok
    [HttpGet("{id}")]
    public IActionResult Get(int id)
    {
        // Logic
    }   

    // api/sales -> don't work
    [HttpGet] // -> ???
    public IActionResult Get(PaginationHelper pagination)
    {
        // Logic
    }  

    // api/sales?me -> don't work
    [HttpGet] // -> ???
    public IActionResult GetMe(bool? me)
    {
        // Logic
    }  
}
Run Code Online (Sandbox Code Playgroud)

Mla*_* B. 6

也许我对这个讨论为时已晚,但是这对于像我一样最终阅读此页面的其他人可能很有价值。API端点的问题在于,您将其中两个端点配置为处理相同的路由:GET /api/sales

如果您尝试访问该路由,则框架将无法区分Get(PaginationHelper)GetMe(bool?)。原因是它们都具有[HttpGet]属性,这意味着它们都能够处理您在[Route("api/[controller]")]类声明上方的属性中指定的路由。由于这些声明为能够处理相同的路由,因此您的Exception(Multiple actions matched)。

问题的解决方案取决于您要处理该歧义路线的操作。假设您希望使用GET /api/sales来处理路由Get(PaginationHelper),则可以将GetMe(bool?)操作方法及其[HttpGet]属性更改为如下所示:

[HttpGet("me")] // GET api/sales/me
public IActionResult GetMe() {
    // Logic
}
Run Code Online (Sandbox Code Playgroud)


Nko*_*osi 5

新框架希望能够更明确地表明端点的意图。

[Route("api/[controller]")]
public class SalesController : Controller {

    [HttpGet("{id:int}")] // GET api/sales/1
    public IActionResult Get(int id) {
        // Logic
    }

    [HttpGet] // GET api/sales?page=1 assuming PaginationHelper has page property
    public IActionResult Get([FromQuery]PaginationHelper pagination) {
        // Logic
    } 

    [HttpGet] // GET api/sales?me=true
    public IActionResult GetMe(bool? me = false) {
        // Logic
    }  
}
Run Code Online (Sandbox Code Playgroud)

参考Asp.Net核心:模型绑定