无法将路线映射为行动,ASP.NET Core Web API

时间:2018-07-10 18:06:26

标签: c# asp.net-core-webapi

我正在研究Web API项目,并且存在以下问题:

我尝试使用以下网址(https://localhost:44328/api/Users/GetUserBy?username=myusername&password=mypassword)调用名为“ 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
    }
}

当我在此方法上插入断点时,无论我是否调用它,代码执行似乎都不会出现。

我在startup.cs文件中添加了以下代码,但没有任何改变。

 app.UseMvc(
            routes =>
            {
                routes.MapRoute("GetUserBy", "{controller=Users}/{action=GetUserBy}");
            }
            );

我也访问了以下网页,但找不到答案。 https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-2.1

2 个答案:

答案 0 :(得分:2)

您遇到路线冲突。

api/Users/GetUserBy

匹配此路线

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

,但是它将URL中的GetUserBy字符串视为路由模板中的{id}

由于"GetUserBy"不是int,您会收到该无效值错误消息。

添加路由约束,以便仅匹配整数。

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

当前的GetUserBy动作将Users/GetUserBy作为其路由模板,如果控制器上具有当前的api/Users/Users/GetUserBy路由模板,则将解析为api/[controller]

考虑使用操作令牌来获得所需的行为。

以下是完成的代码,其中包含上面建议的更改。

[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) {
        //...
    }
}

引用Routing to controller actions in ASP.NET Core

答案 1 :(得分:2)

尝试通过以下方法更改代码:

[HttpGet("Users/GetUserBy")] 

对此:

[HttpGet("GetUserBy")]

您已经将其路由到Controller用户