您的位置:首页 > 编程语言 > ASP

如果调用ASP.NET Web API不能发送PUT/DELETE请求怎么办?

2014-03-18 21:34 405 查看

如果调用ASP.NET Web API不能发送PUT/DELETE请求怎么办?

[code] public class HttpMethodOverrideHandler: DelegatingHandler

{

protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)

{

IEnumerable<string> methodOverrideHeader;

if (request.Headers.TryGetValues("X-HTTP-Method-Override", out methodOverrideHeader))

{

request.Method = new HttpMethod(methodOverrideHeader.First());

}

return base.SendAsync(request, cancellationToken);

}

}

[/code]
[/code]
我们在一个空ASP.NET Web API应用中定义了如下一个继承自ApiController的DemoController,并在其中定义了4个用于返回自身方法名称的Action方法(Get、Post、Put和Delete)。按照ASP.NET Web API默认提供的HTTP方法与Action方法名称之间的映射机制,这4个Action方法支持HTTP方法与自身的方法名称一致。

[code]
[code] public class DemoController : ApiController

{

public string Get()

{

return "Get";

}


 public string Post()

{

 return "Post";

}


 public string Put()

{

 return "Put";

}


 public string Delete()

{

 return "Delete";

}

}

[/code]
[/code]
在Global.asax文件中,我们采用如下的代码将一个HttpMethodOverrideHandler对象注册到ASP.NET Web API的消息处理管道中。我们采用IIS Express作为宿主,并将采用的端口固定为“3721”。

[code]
[code] public class WebApiApplication : System.Web.HttpApplication

{

 protected void Application_Start()

{

 GlobalConfiguration.Configuration.MessageHandlers.Add(new HttpMethodOverrideHandler());

 //其他操作

}

}

[/code]
[/code]
我们创建一个控制台应用作为调用Web API的客户端程序。如下面的代码片断所示,我们定义了一个辅助方法InvokeWebApi根据提供的HttpClient对象和请求采用的HTTP方法进行Web API的调用。在该方法中,我们根据指定的HTTP方法创建了一个指向目标Web API的HttpRequestMessage对象,并将其作为参数调用HttpClient对象的SendAsync方法对目标Web API发起调用。Web API成功调用后会得到最终被执行的目标Action方法的名称,我们将它连同当前请求采用的HTTP方法和“X-HTTP-Method-Override”报头值打印在控制台上。

[code]
[code] class Program

{

 static void Main(string[] args)

{

 HttpClient httpClient1 = new HttpClient();

 HttpClient httpClient2 = new HttpClient();

 HttpClient httpClient3 = new HttpClient();

 HttpClient httpClient4 = new HttpClient();


 httpClient3.DefaultRequestHeaders.Add("X-HTTP-Method-Override", "PUT");

 httpClient4.DefaultRequestHeaders.Add("X-HTTP-Method-Override", "DELETE");


 Console.WriteLine("{0,-7}{1,-24}{2,-6}", "Method", "X-HTTP-Method-Override", "Action");

 InvokeWebApi(httpClient1, HttpMethod.Get);

 InvokeWebApi(httpClient2, HttpMethod.Post);

 InvokeWebApi(httpClient3, HttpMethod.Post);

 InvokeWebApi(httpClient4, HttpMethod.Post);


 Console.Read();

}


 async static void InvokeWebApi(HttpClient httpClient, HttpMethod method)

{

 string requestUri = "http://localhost:3721/api/demo";

 HttpRequestMessage request = new HttpRequestMessage(method, requestUri);

 HttpResponseMessage response = await httpClient.SendAsync(request);

 IEnumerable<string> methodsOverride;

 httpClient.DefaultRequestHeaders.TryGetValues("X-HTTP-Method-Override", out methodsOverride);

 string actionName = response.Content.ReadAsStringAsync().Result;

 string methodOverride = methodsOverride == null ? "N/A" : methodsOverride.First();

 Console.WriteLine("{0,-7}{1,-24}{2,-6}", method, methodOverride, actionName.Trim('"'));

}

}

[/code]
[/code]
在Main方法中,我们创建了4个HttpClient对象(httpClient1、httpClient2、httpClient3和httpClient4),并将“X-HTTP-Method-Override”报头添加到httpClient3和httpClient4的默认报头集合中,指定的HTTP方法分别是“PUT”和“DELETE”。我们将这4个HttpClient对象作为参数调用辅助方法InvokeWebApi对目标Web API发起4次调用,除了第1次(由于InvokeWebApi是一个异步方法,代码中的第一次调用并不意味着它首先被执行,更不能确保针对它的Web API调用率先完成)采用GET请求之外,其余请求均采用POST方法。

在启动Web API宿主程序后运行客户端控制台应用,我们会得到如下所示的输出结果。我们可以清楚地看到在请求不具有“X-HTTP-Method-Override”报头的情况下,执行的Action方法取决于请求采用的HTTP方法。反之,如果请求通过“X-HTTP-Method-Override”报头携带了相应的HTTP方法,它将用于目标Action方法的选择。这一切均是HttpMethodOverrideHandler这个自定义HttpMessageHandler的功劳。


[code]
[code] Method X-HTTP-Method-OverrideAction

 POST PUT Put

 GETN/A Get

 POST N/A Post

 POST DELETEDelete

[/code]
[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐