我一直在关注教程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的。谁能开导我?
答案 0 :(得分:4)
如果您查看Web API Routing and Action Selection的文档:
...
HTTP方法。框架仅选择与请求的HTTP方法匹配的操作,确定如下:
- 您可以使用以下属性指定HTTP方法: AcceptVerbs , HttpDelete , HttpGet , HttpHead ,< strong> HttpOptions , HttpPatch , HttpPost 或 HttpPut 。
- 否则,如果控制器方法的名称以“Get”,“Post”,“Put”,“Delete”,“Head”,“Options”或“Patch”开头,那么按照惯例,操作支持HTTP方法。
- 如果以上都不是,则该方法支持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上搜索一下,你会发现以下问题:
Is there a default verb applied to a Web API ApiController method?
虽然这是一个不同的问题,但问题与你的问题基本相同。