tnblog
首页
视频
资源
登录

在WEB API中进行统一安全验证类DelegatingHandler

3670人阅读 2019/3/25 15:11 总访问:3670 评论:1 收藏:0 手机
分类: web api

根据web api 官方参考文献 总结出一下代码举例:

将 HTTP 响应消息的处理委托给另一处理程序(称为“内部处理程序”)的 HTTP 处理程序的类型。

如何理解这句话的意思?

首先我们应知道Asp.Net Web Api 的http消息响应机制,这里我可以解释为:消息管道串联。官方代码指出:public abstract class DelegatingHandler : System.Net.Http.HttpMessageHandler,

而具体实现“管道串联”是通过DelegatingHandler这个类型来完成。

通过以上文档得出疑问

当DelegatingHandler自己负责的消息处理任务完成之后可以委托另一个HttpMessagHandler进行后续的处理。

如果这个被委托的也是一个DelegatingHandler对象,不就可以组成一个委托链了吗?而这个委托链不就是由一个个DelegatingHandler组成的消息处理管道吗?

 以上问题我们可以从程序集 System.Net.Http.dll, v4.0.0.0中得到答案:

  1. namespace System.Net.Http
  2. {
  3.     // 摘要: 
  4.     //     被称为内部处理程序的并将 HTTP 响应消息委托给另一处理程序的 HTTP 处理程序的基类型。
  5.     public abstract class DelegatingHandler : HttpMessageHandler
  6.     {
  7.         // 摘要: 
  8.         //     创建 System.Net.Http.DelegatingHandler 类的新实例。
  9.         protected DelegatingHandler();
  10.         //
  11.         // 摘要: 
  12.         //     创建特定内部处理程序的 System.Net.Http.DelegatingHandler 类的新实例。
  13.         //
  14.         // 参数: 
  15.         //   innerHandler:
  16.         //     负责处理 HTTP 响应消息的内部处理程序。
  17.         protected DelegatingHandler(HttpMessageHandler innerHandler);
  18.         // 摘要: 
  19.         //     获取或设置处理 HTTP 响应消息的内部处理程序。
  20.         //
  21.         // 返回结果: 
  22.         //     返回 System.Net.Http.HttpMessageHandler。 HTTP 响应消息的内部处理程序。
  23.         public HttpMessageHandler InnerHandler { getset; }
  24.         // 摘要: 
  25.         //     释放由 System.Net.Http.DelegatingHandler 使用的非托管资源,并可根据需要释放托管资源。
  26.         //
  27.         // 参数: 
  28.         //   disposing:
  29.         //     如果为 true,则释放托管资源和非托管资源;如果为 false,则仅释放非托管资源。
  30.         protected override void Dispose(bool disposing);
  31.         //
  32.         // 摘要: 
  33.         //     以异步操作发送 HTTP 请求到内部管理器以发送到服务器。
  34.         //
  35.         // 参数: 
  36.         //   request:
  37.         //     要发送到服务器的 HTTP 请求消息。
  38.         //
  39.         //   cancellationToken:
  40.         //     取消操作的取消标记。
  41.         //
  42.         // 返回结果: 
  43.         //     返回 System.Threading.Tasks.Task<TResult>。 表示异步操作的任务对象。
  44.         //
  45.         // 异常: 
  46.         //   System.ArgumentNullException:
  47.         //     request 为 null。
  48.         protected internal override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken);
  49.     }
  50. }



我们在此可以总结出,如ASP.NET Web API的消息处理管道均由DelegatingHandler组成(位于管道尾端的HttpMessageHandler除外),我们就可以根据其InnerHandler获得对被委托的HttpMessageHandler对象的引用,由此便构成消息处理的链式结构。组成ASP.NET Web API核心框架的消息处理管道,

理论总结的差不多,那么下面我们就对该消息处理委托类进行消息自定义操作,


  1. public class RequestMessageDelegatingHandler : DelegatingHandler
  2.     {
  3.         protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
  4.         {
  5.             return base.SendAsync(request, cancellationToken).ContinueWith((responseToCompleteTask) =>
  6.             {
  7.                 //获取URL参数
  8.                 NameValueCollection query = HttpUtility.ParseQueryString(request.RequestUri.Query);
  9.                 //获取Post正文数据,比如json文本
  10.                 string fRequesContent = request.Content.ReadAsStringAsync().Result;
  11.                 //可以做一些其他安全验证工作,比如Token验证,签名验证。
  12.                 //可以在需要时自定义HTTP响应消息
  13.                 //return SendError("自定义的HTTP响应消息", HttpStatusCode.OK);
  14.                 HttpResponseMessage response = responseToCompleteTask.Result;
  15.                 HttpError error = null;
  16.                 if (response.TryGetContentValue<HttpError>(out error))
  17.                 {
  18.                     //添加自定义错误处理
  19.                     //error.Message = "请求失败";
  20.                 }
  21.                 if (error != null)
  22.                 {
  23.                     //记录关键的异常信息
  24.                     QWPlatform.SystemLibrary.LogManager.Logger.Instance.Error("[" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "]404错误:请求数据" + error.Message);
  25.                     //返回错误信息
  26.                     throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.OK)
  27.                     {
  28.                         //封装处理异常信息,返回指定JSON对象
  29.                         Content = new StringContent(new ZLSoft.CHSS.Web.Public.Library.BaseClass.AjaxResult(Common.Base.AjaxResultType.失败, error.Message + "404").CreateResultString()), //Encoding.GetEncoding("UTF-8"), "application/json"
  30.                         ReasonPhrase = "Exception"
  31.                     });
  32.                 }
  33.                 else
  34.                 {
  35.                     return response;
  36.                 }
  37.             }, cancellationToken);
  38.         }
  39.     }


接下来,我们只要把当前类注册到webapiconfig类当中:

  1. public class WebAPIConfig
  2.     {
  3.         public static void Register(HttpConfiguration config)
  4.         {
  5.             //跨域配置
  6.             config.EnableCors(new EnableCorsAttribute("*""*""*"));
  7.             //  config.MapHttpAttributeRoutes();
  8.             //注册路由映射
  9.             config.Routes.MapHttpRoute(
  10.                 name: "DefaultApi",
  11.                 routeTemplate: "api/{controller}/{action}/{id}",
  12.                 defaults: new { id = RouteParameter.Optional }
  13.                 );
  14.             config.MessageHandlers.Add(new RequestMessageDelegatingHandler()); 
  15. } }


接下里就可以在 RequestMessageDelegatingHandler 中间写好消息处理机制哪里进行统一的安全校验。



评价

剑轩

2019/3/29 17:29:40

nice

如何修改CSS中存的element.style内联样式

改腾讯地图的时候调整了下样式,发现样式一直存在问题,修改style里面的值,一点用都没有,html中这个值还找不到是在哪里出...

问题中成长感悟

工作中怎么可能不会遇到问题。遇到问题在去解决问题就会变强。就会有独立解决问题的能力就会独挡一面。技术如此,做商务自...

类型“DbSet”未引用的程序集中定义。必须添加对程序集“EntityFramework Version=5.0.0.0 Culture=neutral PublicKeyToken=b7

在用mvc+ef的时候在DAL层引用上下文信息的时候会报出下面错误其实就是没得EntityFromwork,打开vs项目,点击工具,选择NuGe...

怎样解决安卓微信浏览器对于第三方网页的两次请求问题?

之前的项目是没有这种情况的,但是最近发现安卓手机在微信浏览器访问第三方网页时,页面点击某个按钮,写日志显示只触发了...

数据读取器与指定的"xx"不兼容。某个类型为"xx"的成员同名的数据读取器中没有对应的列

报错的地方var result= _db.Database.SqlQuery&lt;SMachine&gt;(sql).FirstOrDefault();经过分析,是因为SqlQuery方法查询...

net core获取绝对路径,获取项目根目录。wwwroot所的根目录

在net framework中获取绝对路径可以使用Server.MapPath(&quot;~&quot;)but.....在net core中并没有那个Server对象了在net c...

idea下搭建Spring Boot+Spring MVC+thymeleaf

今天大兄弟来讲一下在idea下,使用Spring Boot ,搭建Spring MVC+thymeleaf。在Java开发领域,Spring Boot算得上是一颗耀眼...

等待所有线程执行完后,执行某个方法

彼年豆蔻,谁许谁地老天荒。在多线程环境下,我们可能会需要等待开辟的线程执行完后,再去执行某个方法,例如输出并行计算...

使用nginx同一台服务器上配置多个二级域名

一般二级域名都是解析到不同的服务器上,但是很多时候没有那么土豪可以用那么多服务器哇。当然土豪完全可以1个二级域名一台...

解决:基础提供程序 Open 上失败,EF无法生成实体问题

在学校图书馆的电脑上安装VS2013和SQL R2后,调试项目报错:基础提供程序在 Open 上失败怀疑是数据库的问题,然后删除数据...

vue.js 学习日记第二章-vue中编写function及一些简单指令

官网:https://cn.vuejs.org/v2/guide/ vue.js 学习日记第一章:http://www.tnblog.net/18323015640/article/details/2...

使用nginx同一台服务器上配置多个二级域名2

在第一篇中介绍了一种方法:http://www.tnblog.net/aojiancc2/article/details/2430其实还可以使用第二种方法,也就是配置...

基于office 把wordwordxpptpptxxlsxlsx转为pdf线预览

//,要在服务器安装office,需要引用usingMicrosoft.Office.Interop.Word;usingMicrosoft.Office.Interop.PowerPoint;usingMi...

基于open office 把各种类型转为pdf线预览

//需要在服务器安装openoffice,引用cli_basetypes,cli_cppuhelper,cli_oootypes,cli_ure,cli_uretypes publicboolCon...

说一点程序中减少判断的做法

我们在架构层面上要尽量减少判断,不要让业余逻辑的变动就去修改代码逻辑那样是很不好的,那样的代码维护性很差,很容易造...
感谢相遇
排名
118
文章
1
粉丝
0
评论
1
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术
愿追逐光明的我们,都会迎来属于自己的春天。