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)
也许我对这个讨论为时已晚,但是这对于像我一样最终阅读此页面的其他人可能很有价值。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)
新框架希望能够更明确地表明端点的意图。
[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)
| 归档时间: |
|
| 查看次数: |
6108 次 |
| 最近记录: |