我有一个API控制器,具有标准的GET,POST和Delete操作。
[Route("api/[controller]")]
[ApiController]
public class UsersController : ControllerBase
{
//Get
[HttpPost]
public async Task Post([FromBody] TestUser testUser, string tempPassword, role = "Guest")
{
}
}
现在,我要使用以下方法添加新操作:
[HttpPost]
[Route("api/[controller]/UpdateRole")]
public async Task Post(string email, List<string> roles)
{
}
当我尝试使用postman调用API时,
类型:POST 端点:http://localhost/api/users/UpdateRole
请求正文:
{
"email":"something@mail.com",
"roles":["S1","s3"]
}
但是我得到了404
作为回复。在服务器上,我可以看到
应用程序未读取整个请求主体就完成了。
答案 0 :(得分:1)
由于/api/Users/api/Users/UpdateRoute
的工作原理,您的总体路线似乎是RouteAttribute
。
[Route("a")]
public class MyController
{
[Route("a/b")]
public IActionResult MyAction()
{
}
}
在这种情况下,上述操作的路由为/a/a/b
,因为操作路由附加到了控制器路由。
您的选择是:
[Route("[controller]/[action]")]
并删除操作路由,在这种情况下,上面的示例将变为/MyController/MyAction
[Route("b")]
,在这种情况下,完整路线将为a/b
[Route("/a/b")]
使用绝对路径,在这种情况下,控制器路线将被忽略,而完整路线将仅为/a/b
。有关路由的更多信息,请参见here。
关于您的null
值问题,ASP.NET Core当前期望将email
和roles
作为查询字符串参数。相反,您应该为请求正文创建一个模型:
public class MyModel
{
public string Email { get; set; }
public List<string> Roles { get; set; }
}
然后将您的操作更改为接受它:
[HttpPost]
[Route("api/[controller]/UpdateRole")]
public async Task Post([FromBody]MyModel model)
{
}