博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【干货】.NET WebApi HttpMessageHandler管道
阅读量:6333 次
发布时间:2019-06-22

本文共 4059 字,大约阅读时间需要 13 分钟。

消息拦截器是一个类,接收 HTTP request并返回 HTTP response,Message handler 继承自抽象类 HttpMessageHandler,那么学习消息过滤器之前你应该了解下webapi的执行流程。

 

以上是webapi的执行流程,先是从response开始执行一套顺序之后通过network再回到了Request,其中经过了messageHandler,因为它是webapi架构中给我们可以自定义handler的地方,这和以往的webform差不多。都是基于http请求的。

有可能你会说这和过滤器Aop模式差不多啊,但你可以看完这篇文章之后再比比谁强大,当然它两者的用处都不同。

那消息拦截器有什么用呢,听名字我觉得你应该就知道是怎么回事,它是可以在客户端请求用修改请求信息的中间层,再次其中我们可以修改;添加 response headers,在到达 controller 之前,进行参数验证!

自定义  MessageHandler 需要继承 System.Net.Http.DelegatingHander 并且重载 SendAsync 方法

public class MessageHandler1 : DelegatingHandler{  protected async override Task
SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { Debug.WriteLine("hello"); var response = await base.SendAsync(request, cancellationToken); Debug.WriteLine("bye"); return response; }}

 这是最基本的处理流程,当然自此期间你需要去添加配置。

public static class WebApiConfig{  public static void Register(HttpConfiguration config)  {    config.MessageHandlers.Add(new MessageHandler1());    config.MessageHandlers.Add(new MessageHandler2());  }}

 在消息拦截器中常见的是要判断用户信息,因为像ActionFilterAttribute、ApiControllerActionInvoker、ExceptionFilterAttribute 这些都是在action之前的,那我们就要在之前进行判断。

 在HttpRequestMessage中包含了以下属性,这些你都是可以改的。

 如何操作header?

protected async override Task
SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { HttpResponseMessage response = await base.SendAsync(request, cancellationToken); response.Headers.Add("X-Custom-Header", "This is my custom header."); return response; }

 首先调用sendAsync将请求传递给inner handler,让它返回响应信息,但是它在创建异步的时候,响应消息是不可用的。

只能全局去配置吗?

//路由中指定Message Handler        config.Routes.MapHttpRoute(            name: "Route2",            routeTemplate: "api2/{controller}/{id}",            defaults: new { id = RouteParameter.Optional },            handler: new MessageHandler2() // per-route message handler     );

这时MessageHandler2替换默认的HttpControllerDispatcher。这个栗子中MessageHandler2创建响应,匹配“Route2”的请求永远不会转到控制器。这使我们可以使用自己的自定义响应替换整个Web API控制器机制。

不知道你有没有想过,如果你的webapi不支持一些特殊的请求,你该怎么办呢,这个时候呵呵,你应该知道了吧!

在这个实例中我们定义了一个集合,在post请求中,一定不是get,那么就有可能是put 或者delete等待的请求头,那么我们可以获取进行修改。

public class MethodOverrideHandler : DelegatingHandler        {            readonly string[] _methods = { "DELETE", "HEAD", "PUT" };            const string _header = "X-HTTP-Method-Override";            protected override Task
SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { if (request.Method == HttpMethod.Post && request.Headers.Contains(_header)) { var method = request.Headers.GetValues(_header).FirstOrDefault(); if (_methods.Contains(method, StringComparer.InvariantCultureIgnoreCase)) { request.Method = new HttpMethod(method); } } return base.SendAsync(request, cancellationToken); } }

  那我们可以获取请求头,如何进行添加呢??

public class CustomHeaderHandler : DelegatingHandler {     async protected override Task
SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { HttpResponseMessage response = await base.SendAsync(request, cancellationToken); response.Headers.Add("X-Custom-Header", "This is my custom-header."); return response; } }

  在以上代码中我们通过base.SendAsync调用内部消息处理器返回相应结果,base.SendAsync之前是不可响应获取消息的。

  这个示例使用了await关键字,以便在SendAsync完成之后异步地执行任务。

protected override Task
SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { return base.SendAsync(request, cancellationToken).ContinueWith( (task) => { HttpResponseMessage response = task.Result; response.Headers.Add("X-Custom-Header", "This is my custom header."); return response; } ); }

转载于:https://www.cnblogs.com/ZaraNet/p/10041289.html

你可能感兴趣的文章
TrueType
查看>>
Swift 利用元组来匹配多个值
查看>>
确认对话框ConfirmDialog和选择对话框OptionDialog:猜数游戏
查看>>
HTML排版标记
查看>>
再见!2015
查看>>
MongoDB 自动分片 auto sharding
查看>>
巧用Android多进程,微信,微博等主流App都在用
查看>>
C++链式结构的自定义容器类(二)--迭代器
查看>>
EPON OLT网管系统的实现
查看>>
CentOS 7最小化安装后找不到‘ifconfig’命令——修复小提示
查看>>
sql server express 2005下载地址
查看>>
kindeditor4.x整合SyntaxHighlighter代码高亮
查看>>
Hibernate-Validate结合SpringMVC数据验证
查看>>
Firefox下给HTTPS Everywhere增加自定义规则
查看>>
DevExpress Asp.Net - 1 已有MVC项目使用DX
查看>>
关于Linux的操作系统《一》
查看>>
读书记录
查看>>
Spring RedisTemplate操作-HyperLogLog操作(7)
查看>>
无任何声明的接口是有效的
查看>>
mysql删除重复记录
查看>>