为什么POST请求映射到此Web API操作方法

本文关键字:Web API 操作方法 POST 请求 映射 为什么 | 更新日期: 2023-09-27 18:25:35

我一直在下面的教程中学习如何使用OAuth在Web API中进行身份验证。

我以前在Web API上工作过,在那里我命名了从Get、Put、Post等开始的方法,以便根据http谓词将它们路由到。我还知道可以用属性([HttpGet]等)来修饰动作,以表示映射到它们的动词。

在本教程中,控制器上有一个操作,如下所示:

// POST api/Account/Register
[AllowAnonymous]
[Route("Register")]
public async Task<IHttpActionResult> Register(UserModel userModel)
{
    if (!ModelState.IsValid)
        return BadRequest(ModelState);
     IdentityResult result = await _repo.RegisterUser(userModel);
     IHttpActionResult errorResult = GetErrorResult(result);
     if(errorResult != null)
        return errorResult;
     return Ok();
}

正如注释所示,此方法响应POST请求。我看不出Web API如何知道此操作是用于POST的。有人能启发我吗?

为什么POST请求映射到此Web API操作方法

如果您查看Web API路由和操作选择的文档:

HTTP方法。框架只选择与请求的HTTP方法匹配的操作,确定如下:

  1. 您可以指定具有属性的HTTP方法:AcceptVerbsHttpDeleteHttpGet
  2. 否则,如果控制器方法的名称以"Get"、"Post"、"Put"、"Delete"、"Head"、"Options"或"Patch"开头,则按照惯例,该操作支持该HTTP方法
  3. 如果以上都不存在,则该方法支持POST

ReflectedHttpActionDescriptor.cs的来源(行号294-300):

...
if (supportedHttpMethods.Count == 0)
{
    // Use POST as the default HttpMethod
    supportedHttpMethods.Add(HttpMethod.Post);
}
return supportedHttpMethods;
...

你会找到答案:

POST是Web API中操作方法的默认HTTP Verb


此外,如果你在SO上搜索更多,你会发现以下问题:
是否有默认谓词应用于Web API ApiController方法?

虽然这是一个不同的问题,但问题与你的基本相同。