asp.net拦截器
一
拦截器又称过滤器。
asp.net mvc本身是自带3种拦截器:Action拦截器、Result拦截器、Exception拦截器。 应用中常见的拦截器有日志拦截器(Action拦截器)和异常处理拦截器(Exception拦截器)。
java里spring mvc也常用拦截器来做些非干预业务逻辑的事,诸如实现HandlerInterceptor接口。
拦截器是AOP(面向切面编程)的一种应用。
拦截器要解决的问题:
二
/// <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拦截器相关推荐
- ASP.NET MVC 拦截器(转)
本文将对"MVC公告发布系统"的发布公告功能添加日志功能和异常处理功能,借此来讨论ASP.NET MVC中拦截器的使用方法. 一个小难题 我们继续完善"MVC公告发布系统 ...
- ASP.NET MVC案例教程——拦截器 Filter
摘要 本文将对"MVC公告发布系统"的发布公告功能添加日志功能和异常处理功能,借此来讨论ASP.NET MVC中拦截器的使用方法. 一个小难题 我们继续完善 ...
- 第六篇:拦截器( MVC案例教程(基于ASP.NET MVC beta))
http://ljl-xyf.javaeye.com/blog/725196 摘要 本文将对"MVC公告发布系统"的发布公告功能添加日志功能和异常处理功能,借此来讨论A ...
- ASP.NET MVC的Action拦截器(过滤器)ActionFilter
有时项目要进行客户端请求(action)进行拦截(过滤)验证等业务,可以使用拦截器进行实现,所谓的action拦截器也没有什么的,只是写一个类,继承另一个类(System.Web.Mvc.Filter ...
- ASP.NET MVC Filter过滤机制(过滤器、拦截器)
https://blog.csdn.net/knqiufan/article/details/82413885 本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/ ...
- ASP.NET Core利用拦截器 IActionFilter实现权限控制
"麦荻网教系统"采用了前后端代码分离的架构,即"Miidy.Cloud.Console"站与"Miidy.Cloud.Manage"站(两个 ...
- springboot 添加拦截器之后中文乱码_springboot中配置了拦截器后,拦截器无效的解决方案之一...
springboot的启动类xxxApplication不能扫描到拦截器配置类,可加上@ComponentScan(basePackages={"com.maya.common"} ...
- axios拦截器_浅谈vue-resource和vue-axios的区别
可能有的人对vue-resource 和vue-axios比较陌生,也可能用到了都不知道.他其实就是我们vue请求里面的 this.$http.*** 和 this.axios.*** vue-res ...
- ABP框架使用拦截器动态配置租户过滤器
前言 最近项目要求在ABP框架中根据TenantId是否为空来配置是否禁用租户过滤器.ABP自身给我我们禁用租户过滤器的两种方法官方文档 https://aspnetboilerplate.com/P ...
最新文章
- encodeURIComponent或者encodeURI 不用行不行?
- 关于抢红包的_关于抢红包的作文500字
- 从微信红包的春节活动运营方案中,必读的运营策略
- SAP导出Excel错点拒绝处理
- 大话设计模式—外观模式
- 人工智能化发展已经到了哪一步?
- 对于下一代互联网的畅想
- 使用Predicate操作Collection集合
- 苹果与阿拉斯加航空公司合作 采用iPad Pro进行自助值机登机
- 下载网络图片显示在Android手机上
- 经典同步问题二——哲学家进餐问题
- 为什么说索引会加速查找过程
- 如何开启远程桌面的服务器,如何启用远程服务器 开启服务器的远程桌面控制...
- TensorFlow 莫烦python
- Silvaco仿真学习
- overflow:atuo;隐藏滚动条
- 数学分析笔记4:一元函数微分学
- 输入一个字符串,输出该字符串中字符的所有组合。(腾讯2014笔试附加题)
- 一文了解 TKG 如何使用 GPU 资源池
- 网课答案php源代码,知到网课答案WEB程序设计(PHP)2020章节测试答案
热门文章
- Visual Studio 2017 Android 调试无法连接到虚拟机
- Java多线程系列--“基础篇”09之 interrupt()和线程终止方式
- BZOJ 1432 [ZJOI2009]Function
- WPF设置ListBoxItem失去焦点时的背景色
- 【转】Compile、Make和Build的区别
- ant 合并 jar
- 2011-05-20
- C++ gets, getline ( string流)
- 开发海思3520a遇到的问题
- LINUX操作系统手机刷机包制作、修改方法