我正在研究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
答案 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) {
//...
}
}
答案 1 :(得分:2)
尝试通过以下方法更改代码:
[HttpGet("Users/GetUserBy")]
对此:
[HttpGet("GetUserBy")]
您已经将其路由到Controller用户