在Web API上调用post方法时获取404

时间:2019-03-20 01:30:46

标签: c# .net asp.net-web-api asp.net-core

我有一个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作为回复。在服务器上,我可以看到

  

应用程序未读取整个请求主体就完成了。

1 个答案:

答案 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当前期望将emailroles作为查询字符串参数。相反,您应该为请求正文创建一个模型:

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)
{

}