我一直在查看本文中的代码(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。我很想知道为什么会这样。
答案 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匹配的操作 请求的方法,确定如下:
您可以使用以下属性指定HTTP方法:AcceptVerbs,HttpDelete,HttpGet,HttpHead,HttpOptions,HttpPatch,HttpPost或 HttpPut。
否则,如果操作名称(控制器方法)以“获取”,“发布”,“放置”,“删除”,“头部”,“选项”或 “修补程序”,然后按照惯例,该操作支持该HTTP方法。
- 醇>
如果不是上述方法,则该方法支持POST。
http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection