是否有应用于Web API ApiController方法的默认动词?

时间:2014-05-15 19:16:02

标签: asp.net asp.net-web-api asp.net-web-api-routing

我一直在查看本文中的代码(https://github.com/patelsan/WebAPIAuthentication):http://www.codeproject.com/Articles/630986/Cross-Platform-Authentication-With-ASP-NET-Web-API

它非常好,似乎工作正常。很少有文章解释这种令牌认证,但这是我见过的最好的。请注意,我是这项技术的新手,还有很多需要学习的地方。

所以,我注意到UsersController有这个代码:

public class UsersController : ApiController
{
    public Status Authenticate(User user)
    {
        . . .
    }
}

Authenticate方法不以已知的HTTP谓词开头,例如获取或发布,并且没有与此方法关联的[HttpGet]或[HttpPost]属性,那么控制器如何知道将此方法与哪个动词相关联?只需查看代码,我怎么知道我需要使用哪个动词?如果没有匹配,是否会出现“默认”动词?

顺便说一句,如果你想知道,唯一有效的动词是POST。我很想知道为什么会这样。

2 个答案:

答案 0 :(得分:21)

每天在学习新东西时提交这个文件!

通常,方法名称匹配为thought of this way。但是,查看WebAPI源代码时,有一个回退逻辑分支。如果方法名称没有映射(通过属性或约定)到支持的HTTP谓词,则默认为POST。

默认情况下,操作选择通过ReflectedHttpActionDescriptor类进行。这里重要的方法是GetSupportedHttpMethods()。在相关部分中,代码为:

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

您可以看到full source here(位于文件中间)。

答案 1 :(得分:13)

在这种特殊情况下,默认的Http Verb是 POST 。在其他情况下,默认动词取决于操作的名称和其他因素。以下是asp.net引用的算法:

  

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

     
      
  1. 您可以使用以下属性指定HTTP方法:AcceptVerbs,HttpDelete,HttpGet,HttpHead,HttpOptions,HttpPatch,HttpPost或   HttpPut。

  2.   
  3. 否则,如果操作名称(控制器方法)以“获取”,“发布”,“放置”,“删除”,“头部”,“选项”或   “修补程序”,然后按照惯例,该操作支持该HTTP方法。

  4.   
  5. 如果不是上述方法,则该方法支持POST。

  6.   

http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection