如果调用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]
相关文章推荐
- 如果调用ASP.NET Web API不能发送PUT/DELETE请求怎么办?
- asp.net WebApi不能接收到Put和Delete请求,试图发送Put和Delete请求时得到405异常
- [整理]IIS 6.0 下部署 Asp.net MVC Web Api 后 HTTP PUT and DELETE 请求失败
- REST架构下,浏览器怎么发送put与delete请求?
- asp.net web api http put delete , iis 返回400.0 找不到错误的解决办法.
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【五】——在Web Api中实现Http方法(Put,Post,Delete)
- 怎么用asp或asp.net取得当前流媒体是有流的, 也就是说,如果一个视频能播放就显示出来,如果不能播放就堪不显示出来
- asp.net web API 的调用返回Json值 POST方式请求
- .net http发送put、delete请求报405错误解决办法
- Asp.Net Core IIS发布后PUT、DELETE请求错误405.0 - Method Not Allowed 因为使用了无效方法(HTTP 谓词)
- ASP.NET Webform或者ASP.NET MVC站点部署到IIS下,默认情况下.json文件是不能被访问的,如果请求访问.json文件,则会出现找不到文件的404错误提示
- asp.net web api使用默认路由 put delete动作在IIS下受限
- 【C#】对异步请求处理程序IHttpAsyncHandler的理解和分享一个易用性封装 【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法 【手记】手机网页弹出层后屏蔽底层的滑动响应 【手记】ASP.NET提示“未能创建类型”处理 【Web】一个非常简单的移动web消息框 【手记】解决EXCEL跑SQL遇“查询无法运行或数据库表无法打开...”
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【五】——在Web Api中实现Http方法(Put,Post,Delete)
- C#编译器优化那点事 c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错 webAPI 控制器(Controller)太多怎么办? .NET MVC项目设置包含Areas中的页面为默认启动页 (五)Net Core使用静态文件 学习ASP.NET Core Razor 编程系列八——并发处理
- asp web api 怎么使用put和delete。
- 关于ASP.NET中调用Excel组件不能结束进程的解决方法
- ASP.NET Web API与Owin OAuth:调用与用户相关的Web API(非第三方登录)
- 在ASP.NET页面IIS7.5环境下调用MoonAPNS发送iOS全局推送失败的原因
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【九】——API变了,客户端怎么办?