【问题标题】:Why do POST requests map to this Web API action method?为什么 POST 请求会映射到此 Web API 操作方法?
【发布时间】:2014-10-03 07:31:24
【问题描述】:

我一直在关注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 的。谁能赐教?

【问题讨论】:

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


    【解决方案1】:

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

    ...

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

    1. 您可以使用属性指定 HTTP 方法:AcceptVerbsHttpDeleteHttpGetHttpHead、HttpOptions、HttpPatchHttpPostHttpPut
    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 上搜索更多内容,您会发现以下问题:
    Is there a default verb applied to a Web API ApiController method?

    虽然是不同的问题,但问题和你的基本一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      • 2020-07-05
      • 2017-11-07
      • 2019-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多