Gre*_*ech 5 rest asp.net-mvc http-method http-headers
我正在使用ASP.NET MVC实现RESTful API的原型,除了奇怪的bug之外,我已经实现了我在开始时设置的所有要求,除了调用者能够使用X-HTTP-Method-Override自定义标头覆盖HTTP方法.
我想要的是以下要求......
GET /someresource/123 HTTP/1.1
X-HTTP-Method-Override: DELETE
Run Code Online (Sandbox Code Playgroud)
...将被调度到我的控制器方法,该方法实现DELETE功能而不是该GET操作的功能(假设有多个方法实现该操作,并且它们标记有不同的[AcceptVerbs]属性).因此,鉴于以下两种方法,我希望将上述请求分发给第二个:
[ActionName("someresource")]
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult GetSomeResource(int id) { /* ... */ }
[ActionName("someresource")]
[AcceptVerbs(HttpVerbs.Delete)]
public ActionResult DeleteSomeResource(int id) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
有人知道这是否可行?这样做会有多少工作......?
您将无法按原样使用[AcceptVerbs]属性,因为它与请求的实际HTTP谓词相关联.幸运的是,[AcceptVerbs]属性非常简单; 你可以看到自己的来源http://www.codeplex.com/aspnet/SourceControl/changeset/view/21528#266431.
简而言之,子类AcceptsVerbsAttribute并覆盖IsValidForRequest()方法.实现将类似于以下内容:
string incomingVerb = controllerContext.HttpContext.Request.Headers["X-HTTP-Method-Override"] ?? controllerContext.HttpContext.Request.Method;
return Verbs.Contains(incomingVerb, StringComparer.OrdinalIgnoreCase);
Run Code Online (Sandbox Code Playgroud)