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得到一个nameFlag
string nameFlag;
if (url.IndexOf(".ashx", StringComparison.OrdinalIgnoreCase) > )
{
var arr = url.Split('/');
string ashxName = arr.FirstOrDefault(str => str.IndexOf(".ashx", StringComparison.OrdinalIgnoreCase) > );
nameFlag = ashxName.Substring(, ashxName.IndexOf('.'));
if (nameFlag == "AgentPayQuery")
{
nameFlag = "QueryAgentPay";
}
}
else
{
nameFlag = url.Replace('/', '_').Replace('.', '_');
} // * 设置当前工作线程的name
Thread.CurrentThread.Name = string.Format("[{0}_T{1:HHmmssfff}_{2}]", nameFlag, DateTime.Now, Guid.NewGuid().ToString().Replace("-", "").Substring(, ).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后访问接口所记录的日志:

asp.net拦截器的更多相关文章
- Asp.net Mvc 身份验证、异常处理、权限验证(拦截器)实现代码
本问主要介绍asp.net的身份验证机制及asp.net MVC拦截器在项目中的运用.现在让我们来模拟一个简单的流程:用户登录>权限验证>异常处理 1.用户登录 验证用户是否登录成功步骤直 ...
- ASP.NET MVC 拦截器IResultFilter
在ASP.NET MVC中,有一个Result拦截器,实现ResultFilter需要继承一个类(System.Web.Mvc.FilterAttribute)和实现一个类(System.Web.Mv ...
- ASP.NET MVC 异常Exception拦截器Fillter
异常信息的处理在程序中非常重要, 在asp.net mvc中提供异常属性拦截器进行对异常信息的处理,异常拦截器也没有什么的,只是写一个类,继承另一个类(System.Web.Mvc.FilterAtt ...
- ASP.NET MVC案例——————拦截器
摘要 本文将对“MVC公告发布系统”的发布公告功能添加日志功能和异常处理功能,借此来讨论ASP.NET MVC中拦截器的使用方法. 一个小难题 我们继续完善“MVC公告发布系统”, ...
- ASP.NET MVC中的拦截器
在ASP.NET MVC中,有三种拦截器:Action拦截器.Result拦截器和Exception拦截器, 所谓的拦截器也没有什么的,只是写一个类,继承另一个类和一个接口,顺便实现接口里面的方法而以 ...
- 在ASP.NET Core MVC中子类Controller拦截器要先于父类Controller拦截器执行
我们知道在ASP.NET Core MVC中Controller上的Filter拦截器是有执行顺序的,那么如果我们在有继承关系的两个Controller类上,声明同一种类型的Filter拦截器,那么是 ...
- ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第六篇:拦截器
摘要 本文将对“MVC公告发布系统”的发布公告功能添加日志功能和异常处理功能,借此来讨论ASP.NET MVC中拦截器的使用方法. 一个小难题 我们继续完善“MVC公告发布系统”, ...
- ASP.NET Core 3.0 gRPC 拦截器
目录 ASP.NET Core 3.0 使用gRPC ASP.NET Core 3.0 gRPC 双向流 ASP.NET Core 3.0 gRPC 拦截器 一. 前言 前面两篇文章给大家介绍了使用g ...
- ASP.NET Core搭建多层网站架构【9.2-使用Castle.Core实现动态代理拦截器】
2020/01/31, ASP.NET Core 3.1, VS2019, Autofac.Extras.DynamicProxy 4.5.0, Castle.Core.AsyncIntercepto ...
随机推荐
- VMware与Centos系统安装 和重置root密码
VMware与Centos系统安装 今日任务 1.Linux发行版的选择 2.vmware创建一个虚拟机(centos) 3.安装配置centos7 4.xshell配置连接虚拟机(centos) ...
- vsCode配置C++调试环境
1.下载安装VSCode,安装mscpptools ,直接搜索c++,或者mscpptools 2.下载MinGW 安装好,一般默认安装到C:\MinGW 安装好后直接启动. 选择需要的gcc ,g+ ...
- CentOS 7 升级内核
升级 CentOS 内核参考资料 1 升级 CentOS 内核参考资料 2 通过 /proc 虚拟文件系统读取或配置内核 Linux 内核官网 CentOS 官网 1. 关于 Linux 内核 Lin ...
- C-Free 5 安装 [Error] G__~1.EXE: (x86)\C-FREE~1\mingw\mingw32\bin\: No such file or directory
解决[Error] g++.exe: 5\mingw\include: No such file or directory - 陆总的博客 - CSDN博客 https://blog.csdn.net ...
- PHP之fopen wrappers模块
一.fopen wrappers模块的配置 ①.allow_url_fopen boolean //出于安全性考虑,此选项只能在 php.ini 中设置 //本选项激活了 URL 形式的 fopen ...
- influxdb服务器 relay
https://www.influxdata.com/time-series-platform/influxdb/ https://www.xusheng.org/blog/2016/07/30/pe ...
- 【未完待续】API接口
1.json传输 2.安全:权限 http://blog.csdn.net/linlzk/article/details/50748580. 比如:调用端有userId.psw.version.ti ...
- Vue中父子组件执行的先后顺序
Vera Vue中父子组件执行的先后顺序探讨(转载) 前几天,朋友向我提出了一个关于Vue中父子组件执行的先后顺序问题,相信很多朋友在学习的过程中也会遇到这个问题,所以我就在此提出我自己的一些小看 ...
- javascript 实例 静态 公共 私有
传统 javascript 的原型对象 和 ts的类 对比 传统原型队形说明: //对象构造函数 function Atest(name) { //私有属性,只能在对象构造函数内部使用 var cla ...
- ios禁止页面下拉
document.querySelector('body').addEventListener('touchmove', function(e) { e.preventDefault(); } ...