C# Can';t映射行动路线,ASP.NET核心Web API

C# Can';t映射行动路线,ASP.NET核心Web API,c#,asp.net-core-webapi,C#,Asp.net Core Webapi,我正在从事Web API项目,遇到以下问题: 我尝试使用以下Url()调用名为“GetUserBy”的操作方法,但在浏览器中收到的结果如下所示: {"id":["The value 'GetUserBy' is not valid."]} 下面是我的UsersController: [Route("api/[controller]")] [ApiController] public class UsersController : ControllerBase { // GET: ap

我正在从事Web API项目,遇到以下问题:

我尝试使用以下Url()调用名为“GetUserBy”的操作方法,但在浏览器中收到的结果如下所示:

{"id":["The value 'GetUserBy' is not valid."]}
下面是我的UsersController:

[Route("api/[controller]")]
[ApiController]
public class UsersController : ControllerBase
{

    // GET: api/Users
    [HttpGet]
    public IEnumerable<User> GetUsers()
    {
        //this works
        //code removed for simplicity
    }

    //GET: api/Users/5
    [HttpGet("{id}")]
    public async Task<IActionResult> GetUser([FromRoute] int id)
    {
       //this works too
    }

    [HttpGet("Users/GetUserBy")]
    public async Task<IActionResult> GetUserBy([FromQuery]string username, [FromQuery]string password)
    {
        //this doesn't work
    }
}
我也访问了以下网页,但我找不到答案。

您遇到了路由冲突

api/Users/GetUserBy
符合这条路线

//GET: api/Users/5
[HttpGet("{id}")]
public async Task<IActionResult> GetUser([FromRoute] int id)
{
   //this works too
}
当前的
GetUserBy
操作将
Users/GetUserBy
作为其路由模板,在给定控制器上的当前
api/[controller]
路由模板的情况下,该模板将解析为
api/Users/Users/GetUserBy

考虑使用动作标记来获得所需的行为

下面是完成的代码以及上面建议的更改

[Route("api/[controller]")]
[ApiController]
public class UsersController : ControllerBase {

    // GET: api/Users
    [HttpGet]
    public IEnumerable<User> GetUsers() {
        //...
    }

    //GET: api/Users/5
    [HttpGet("{id:int}")]
    public async Task<IActionResult> GetUser([FromRoute] int id) {
       //...
    }
    //GET: api/Users/GetUserBy
    [HttpGet("[action]")]
    public async Task<IActionResult> GetUserBy([FromQuery]string username, [FromQuery]string password) {
        //...
    }
}
[路由(“api/[控制器]”)]
[ApiController]
公共类UsersController:ControllerBase{
//获取:api/用户
[HttpGet]
公共IEnumerable GetUsers(){
//...
}
//获取:api/Users/5
[HttpGet(“{id:int}”)]
公共异步任务GetUser([FromRoute]int id){
//...
}
//获取:api/Users/GetUserBy
[HttpGet(“[action]”)
公共异步任务GetUserBy([FromQuery]字符串用户名,[FromQuery]字符串密码){
//...
}
}

参考

尝试从以下位置更改标签:

[HttpGet("Users/GetUserBy")] 
为此:

[HttpGet("GetUserBy")]

您已经将其路由到控制器用户

尝试将您的标记从以下位置更改为:
[HttpGet(“Users/GetUserBy”)]
[HttpGet(“GetUserBy”)]
,您已经将其路由到控制器名为Users的位置。我已经尝试了很多次,但都没有成功:)@Ryan Wilson,谢谢。我知道一些简单的事情是……不客气。祝你过得愉快!:)操作方法周围的括号给了我InvalidOperationException错误和双括号-与我遇到的问题相同..@A.M请查看此处的文档InvalidOperationException:属性路由信息出现以下错误:错误1:操作:'ddddddservice.userscoontroller.GetUserBy(ddddddddService)'错误:处理模板'api/[controller]/[Users]/[GetUserBy]'时,找不到令牌'Users'的替换值。可用令牌:“操作,控制器”。若要在路由或约束中使用'['或']'作为文本字符串,请改用'['或']]'。
[HttpGet("Users/GetUserBy")] 
[HttpGet("GetUserBy")]