拦截器又称过滤器。

asp.net mvc本身是自带3种拦截器:Action拦截器、Result拦截器、Exception拦截器。 应用中常见的拦截器有日志拦截器(Action拦截器)和异常处理拦截器(Exception拦截器)。

java里spring mvc也常用拦截器来做些非干预业务逻辑的事,诸如实现HandlerInterceptor接口。

拦截器是AOP(面向切面编程)的一种应用。

拦截器要解决的问题:

1.代码复用。拦截器可被复用
2.职责单一。比如厨师只负责炒菜,不管前期的洗菜、后续的送菜工作。菜变质了也是直接喊一声就有人来处理。
asp.net的拦截器怎么实现呢?
旧瓶装新酒,asp.net的拦截器需要通过IHttpModule接口来实现。

这两天重构支付中心代码,将设置线程名和IP白名单这2个功能做成拦截器。
如下是线程名Filter的代码:
    /// <summary>/// 设置当前工作线程的名称。供用来统一标识记录的日志/// </summary>public class ThreadNameFilter : IHttpModule{LogHelperUtil logHelper = new LogHelperUtil(typeof(ThreadNameFilter).Name);public void Dispose(){//throw new NotImplementedException();
        }public void Init(HttpApplication context){//NewMethod(context);请求在此上下文中不可用
context.BeginRequest += context_BeginRequest;}/// <summary>/// 设置当前工作线程的name/// </summary>/// <param name="sender"></param>private void SetThreadName(object sender){if (null != Thread.CurrentThread.Name){return;}HttpApplication application = (HttpApplication)sender;HttpRequest request2 = application.Context.Request;HttpResponse response = application.Context.Response;string url = request2.Url.LocalPath;url = url.Trim('/');// * 根据请求url得到一个nameFlagstring nameFlag;if (url.IndexOf(".ashx", StringComparison.OrdinalIgnoreCase) > 0){var arr = url.Split('/');string ashxName = arr.FirstOrDefault(str => str.IndexOf(".ashx", StringComparison.OrdinalIgnoreCase) > 0);nameFlag = ashxName.Substring(0, ashxName.IndexOf('.'));if (nameFlag == "AgentPayQuery"){nameFlag = "QueryAgentPay";}}else{nameFlag = url.Replace('/', '_').Replace('.', '_');}// * 设置当前工作线程的nameThread.CurrentThread.Name = string.Format("[{0}_T{1:HHmmssfff}_{2}]", nameFlag, DateTime.Now, Guid.NewGuid().ToString().Replace("-", "").Substring(0, 5).ToUpper());logHelper.Write("线程名已设置为:{0} url:{1}", Thread.CurrentThread.Name, url);}void context_BeginRequest(object sender, EventArgs e){SetThreadName(sender);}}

接下来,web.config配置此module:

可在<system.web>节点下的<httpModules>里配置,也可在<system.webServer>节点下的<modules>里配置。  这取决于应用程序池的托管管道模式。经典模式用前者,集成模式用后者。

本地vs2013里的iisexpress默认是集成模式。所以,本地vs2013调试程序要在<system.webServer>里配置module。

  <system.webServer><modules> <!--runAllManagedModulesForAllRequests="true"--><add name="threadNameFilter" type="PaymentPlatform.Filters.ThreadNameFilter" preCondition="managedHandler" /><add name="ipValidationInterceptor" type="PaymentPlatform.Filters.IPValidationInterceptor" preCondition="managedHandler"/> <!--只对托管资源起作用--></modules> <handlers>。。。。。。</handlers></system.webServer>

这样,一个拦截器的开发就完成了。

在后续的测试时,出现了一些波折。

本地在启动vs2013执行iisexpress站点应用程序时,发现明明在ThreadNameFilter 里设置了线程名,但观察在后续ashx里记录的日志里,并没有获取到那个线程名,whatever in Debug or in Release。这让我想到之前写的一篇博客《巧用CurrentThread.Name来统一标识日志记录(续)》,在ashx文件的默认构造器里设置的线程名,在其ProcessRequest方法的处理逻辑里也是获取不到的。

经多次鼓捣,才发现,把站点程序发布到IIS7上之后,无论apppool的托管模式是集成(目前,集成模式是主流)还是经典,在ThreadNameFilter 里设置的线程名可以被后续ashx里获取到!

同样,细心的观察了一下,《巧用CurrentThread.Name来统一标识日志记录(续)》里提到的问题,发布到IIS7后也不存在,即在ashx文件的默认构造器里设置的线程名,在其ProcessRequest方法的处理逻辑里可以获取到!

下图是本地vs2013里访问接口所记录的日志:

下图是发布到iis7后访问接口所记录的日志:

转载于:https://www.cnblogs.com/buguge/p/7728928.html

asp.net拦截器相关推荐

  1. ASP.NET MVC 拦截器(转)

    本文将对"MVC公告发布系统"的发布公告功能添加日志功能和异常处理功能,借此来讨论ASP.NET MVC中拦截器的使用方法. 一个小难题 我们继续完善"MVC公告发布系统 ...

  2. ASP.NET MVC案例教程——拦截器 Filter

    摘要       本文将对"MVC公告发布系统"的发布公告功能添加日志功能和异常处理功能,借此来讨论ASP.NET MVC中拦截器的使用方法. 一个小难题       我们继续完善 ...

  3. 第六篇:拦截器( MVC案例教程(基于ASP.NET MVC beta))

    http://ljl-xyf.javaeye.com/blog/725196 摘要       本文将对"MVC公告发布系统"的发布公告功能添加日志功能和异常处理功能,借此来讨论A ...

  4. ASP.NET MVC的Action拦截器(过滤器)ActionFilter

    有时项目要进行客户端请求(action)进行拦截(过滤)验证等业务,可以使用拦截器进行实现,所谓的action拦截器也没有什么的,只是写一个类,继承另一个类(System.Web.Mvc.Filter ...

  5. ASP.NET MVC Filter过滤机制(过滤器、拦截器)

    https://blog.csdn.net/knqiufan/article/details/82413885 本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/ ...

  6. ASP.NET Core利用拦截器 IActionFilter实现权限控制

    "麦荻网教系统"采用了前后端代码分离的架构,即"Miidy.Cloud.Console"站与"Miidy.Cloud.Manage"站(两个 ...

  7. springboot 添加拦截器之后中文乱码_springboot中配置了拦截器后,拦截器无效的解决方案之一...

    springboot的启动类xxxApplication不能扫描到拦截器配置类,可加上@ComponentScan(basePackages={"com.maya.common"} ...

  8. axios拦截器_浅谈vue-resource和vue-axios的区别

    可能有的人对vue-resource 和vue-axios比较陌生,也可能用到了都不知道.他其实就是我们vue请求里面的 this.$http.*** 和 this.axios.*** vue-res ...

  9. ABP框架使用拦截器动态配置租户过滤器

    前言 最近项目要求在ABP框架中根据TenantId是否为空来配置是否禁用租户过滤器.ABP自身给我我们禁用租户过滤器的两种方法官方文档 https://aspnetboilerplate.com/P ...

最新文章

  1. encodeURIComponent或者encodeURI 不用行不行?
  2. 关于抢红包的_关于抢红包的作文500字
  3. 从微信红包的春节活动运营方案中,必读的运营策略
  4. SAP导出Excel错点拒绝处理
  5. 大话设计模式—外观模式
  6. 人工智能化发展已经到了哪一步?
  7. 对于下一代互联网的畅想
  8. 使用Predicate操作Collection集合
  9. 苹果与阿拉斯加航空公司合作 采用iPad Pro进行自助值机登机
  10. 下载网络图片显示在Android手机上
  11. 经典同步问题二——哲学家进餐问题
  12. 为什么说索引会加速查找过程
  13. 如何开启远程桌面的服务器,如何启用远程服务器 开启服务器的远程桌面控制...
  14. TensorFlow 莫烦python
  15. Silvaco仿真学习
  16. overflow:atuo;隐藏滚动条
  17. 数学分析笔记4:一元函数微分学
  18. 输入一个字符串,输出该字符串中字符的所有组合。(腾讯2014笔试附加题)
  19. 一文了解 TKG 如何使用 GPU 资源池
  20. 网课答案php源代码,知到网课答案WEB程序设计(PHP)2020章节测试答案

热门文章

  1. Visual Studio 2017 Android 调试无法连接到虚拟机
  2. Java多线程系列--“基础篇”09之 interrupt()和线程终止方式
  3. BZOJ 1432 [ZJOI2009]Function
  4. WPF设置ListBoxItem失去焦点时的背景色
  5. 【转】Compile、Make和Build的区别
  6. ant 合并 jar
  7. 2011-05-20
  8. C++ gets, getline ( string流)
  9. 开发海思3520a遇到的问题
  10. LINUX操作系统手机刷机包制作、修改方法