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

时间:2014-10-03 07:31:25

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

我一直在关注教程here,以便通过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的。谁能开导我?

1 个答案:

答案 0 :(得分:4)

如果您查看Web API Routing and Action Selection的文档:

  

...

     

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

     
      
  1. 您可以使用以下属性指定HTTP方法: AcceptVerbs HttpDelete HttpGet HttpHead ,< strong> HttpOptions , HttpPatch HttpPost HttpPut
  2.   
  3. 否则,如果控制器方法的名称以“Get”,“Post”,“Put”,“Delete”,“Head”,“Options”或“Patch”开头,那么按照惯例,操作支持HTTP方法。
  4.   
  5. 如果以上都不是,则该方法支持POST。
  6.         

    ...

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上搜索一下,你会发现以下问题:
Is there a default verb applied to a Web API ApiController method?

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