C# ASP.NET核心属性路由
我正在将一个项目迁移到asp net core,但我无法配置这些路由,我正在使用属性映射操作 ASP.Net WebAPI2的代码 ASP.Net核心代码 在文件Startup.cs中设置为app.UseMvc()C# ASP.NET核心属性路由,c#,asp.net-core,asp.net-core-2.0,asp.net-core-routing,C#,Asp.net Core,Asp.net Core 2.0,Asp.net Core Routing,我正在将一个项目迁移到asp net core,但我无法配置这些路由,我正在使用属性映射操作 ASP.Net WebAPI2的代码 ASP.Net核心代码 在文件Startup.cs中设置为app.UseMvc() 新框架期望更明确地指示端点的意图 [Route("api/[controller]")] public class SalesController : Controller { [HttpGet("{id:int}")] // GET api/sales/1 pub
新框架期望更明确地指示端点的意图
[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
}
}
参考也许我现在讨论得太晚了,但这对其他最终阅读本页的人来说可能很有价值,就像我一样。API端点的问题在于,您将其中两个端点配置为处理相同的路由:
GET/API/sales
如果尝试访问该路由,框架将无法区分Get(PaginationHelper)
和GetMe(bool?
)。原因是它们都具有[HttpGet]
属性,这意味着它们都能够处理您在类声明上方的[route(“api/[controller]”)
属性中指定的路由。由于这些被声明为能够处理相同的路由,因此您的异常(多个操作匹配
)
问题的解决方案取决于您希望处理该模糊路线的操作。假设您希望路由GET/api/sales
由GET(PaginationHelper)
处理,您可以将GetMe(bool?)
操作方法及其[HttpGet]
属性更改为以下内容:
[HttpGet("me")] // GET api/sales/me
public IActionResult GetMe() {
// Logic
}
我不确定。。但是我认为您可以为该方法添加一个路由,可能需要在现有路由之前添加,或者您可以使用特定路由为该方法添加一个路由属性。路线规则在声明时很重要,如果其他捕获物先到达,您将无法到达。这对您有效吗?//GET api/values[HttpGet]public IActionResult GET(){return Ok(新字符串[]{“value1”,“value3”});}参数[me]将是一个过滤器,默认情况下为false,但我可以输入sales吗?me=true,在这种情况下,此属性无法解决此问题不起作用,错误消息:处理请求时发生未处理的异常。AmbiguousActionException:匹配了多个操作。以下操作匹配路由数据并满足所有约束:与方法public-IActionResult-Get([FromQuery]PaginationHelper-page)冲突和public-IActionResult-GetMe(bool-me)完美,这正是我所寻找的解决方案。绝对“对最终阅读本页的其他人有价值”!
[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
}
}
[HttpGet("me")] // GET api/sales/me
public IActionResult GetMe() {
// Logic
}