我正在使用ASP.NET MVC实现RESTful API的原型,除了奇怪的bug之外,我已经实现了我在开始时设置的所有要求,除了调用者能够使用X-HTTP-Method-Override
自定义标头覆盖HTTP方法.
我想要的是以下要求......
GET /someresource/123 HTTP/1.1 X-HTTP-Method-Override: DELETE
...将被调度到我的控制器方法,该方法实现DELETE
功能而不是该GET
操作的功能(假设有多个方法实现该操作,并且它们标记有不同的[AcceptVerbs]
属性).因此,鉴于以下两种方法,我希望将上述请求分发给第二个:
[ActionName("someresource")] [AcceptVerbs(HttpVerbs.Get)] public ActionResult GetSomeResource(int id) { /* ... */ } [ActionName("someresource")] [AcceptVerbs(HttpVerbs.Delete)] public ActionResult DeleteSomeResource(int id) { /* ... */ }
有人知道这是否可行?这样做会有多少工作......?
您将无法按原样使用[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);