SharePoint利用HttpModule的Init方法实现全局初始化
我们知道,HttpRuntime中会对每一个Request创建一个HttpApplication对象(HttpApplicationFactory从一个HttpApplication池来拿)。对于Global.asax,当创建第一个HttpApplication对象才会执行的Application_Start方法。
然后每一个HttpApplication对象会创建HttpModule对象,然后只执行一次Init方法。但在实际场景中,HttpRuntime会根据请求次数创建多个HttpApplication对象,所以每一个对象都会执行一遍Init方法,那怎么实现只执行一次Init方法来实现类似Application_Start方法中程序初始化呢?
我的处理是加个静态标记变量即可。
解决方案
现在项目中需要有一个自动清理过期的数据的线程,需要实时清理脏数据,可以在Init中这样实现:
private static bool HasAppStarted = false;
private readonly static object _syncObject = new object(); public void Init(HttpApplication context)
{
// Below is an example of how you can handle LogRequest event and provide
// custom logging implementation for it
context.LogRequest += new EventHandler(OnLogRequest);
context.BeginRequest +=
(new EventHandler(this.Application_BeginRequest));
context.EndRequest +=
(new EventHandler(this.Application_EndRequest)); if (!HasAppStarted)
{
lock (_syncObject)
{
//最后一道铁闸,在高并发情况下也会只执行一次,此处必须加上判断
if (!HasAppStarted)
{
// Run application StartUp code here
//ThreadPool.QueueUserWorkItem(new WaitCallback(ClearExpireData));
Thread thread = new Thread(ClearExpireData);
thread.IsBackground = true;
thread.Start();
//将标志位设置为True,就再也不会执行了
HasAppStarted = true;
}
}
}
}
注意以下这两段代码本身就是针对每一次请求所必要执行的,如BeginRequest对每一次请求可以进行URL Rewrite。所以把它独立开来。
context.LogRequest += new EventHandler(OnLogRequest);
context.BeginRequest +=
(new EventHandler(this.Application_BeginRequest));
context.EndRequest +=
(new EventHandler(this.Application_EndRequest));
结语
在SharePoint下可以利用HttpModule的Init来替代Application_Start,这样就避免去直接编辑网站根目录下的Global文件。
SharePoint利用HttpModule的Init方法实现全局初始化的更多相关文章
- [super init]方法的调用
当重新覆盖父类的init方法时,需要调用[super init]方法确认父类中的init是返回一个实例,而不是一个空的实例. 那为什么要调用这个呢? 我得猜测是这样的:因为这是一个初始化方法,需要对对 ...
- asp.net利用HttpModule实现防sql注入和加载样式和JS文件
1.新建一个类,实现IHttpModule接口 代码如下: public class SqlHttpModule : IHttpModule { public void Dispose() { } p ...
- 利用Apperance协议定义View的全局外观
假设要定义一个全局的bkColor用于背景颜色 1.@property(nonatomic,strong)UIColor *bkColor UI_APPEARANCE_SELECTOR; 2.在下面方 ...
- Swift基础之init方法,实例方法,类方法(静态方法)的使用(多标签Demo)
Xcode更新过后,有些方法都进行了改变,Demo中有变化的都进行了简单的标记,具体以后遇见再说 创建一个UIView类,用init方法创建两种类型,显示多标签,创建静态方法进行调用,创建类方法进行调 ...
- 01_5_SERVLET为什么有2个init方法
01_5_SERVLET为什么有2个init方法 1. 在web.xml配置初始化参数 <servlet> <servlet-name>TestInitServlet</ ...
- init()方法必须使用super.init(config)的原因--Servlet
原 因: 一个servlet在它的init()方法中传递它的ServletConfig实例,在其他的方法中却不可以.当一个servlet在 init()方法外需要调用config对象时就会产生问题.使 ...
- iOS开发init方法解析
自定义的init方法,都必须调用父类的init方法. 一般情况下为: - (id)init { [super init]; xxx = xxx; } 通常情况下,这种模式可以满 ...
- Swift基础--Swift中的分类以及在分类中扩展init方法的注意事项
Swift中的分类 1.创建一个空的swift文件 2.关键字extension,格式: extension 要扩展的类名 {} extension UIButton { } Swift中扩展init ...
- OC小实例关于init方法不小心的错误
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
随机推荐
- 微软BI 之SSRS 系列 - 使用分组 Group 属性实现基于父子递归关系的汇总报表
基于父子关系的递归结构在公司组织结构里比较常见,基本上都是在一张表里实现的自引用关系.在报表中如果要实现这种效果,并且在这个基础上做一些数据的汇总,可以使用到下面提到的方法. 要实现的效果大致如下 - ...
- 世纪互联提供的关于Powershell中将虚拟机加入备份保管库的方法
请您参考以下步骤进行操作,如有问题请与我们联系: 对一台ARM虚拟机(虚拟机名称:paularm08r21)进行备份(参考:https://www.azure.cn/documentation/art ...
- 算法笔记_231:网格中移动字母(Java)
目录 1 问题描述 2 解决方案 1 问题描述 2x3=6个方格中放入ABCDE五个字母,右下角的那个格空着.如图[1.jpg]所示. 和空格子相邻的格子中的字母可以移动到空格中,比如,图中的C和 ...
- MySQL general log
1:查看版本 SELECT VERSION(); 2:查看当前的日志保存方式 mysql> SHOW VARIABLES LIKE '%log_output%'; +-------------- ...
- Java常用的非受检异常
IllegalArgumentException 非 null 的参数值不正确 IllegalStateException 对于方法调用而言,对象状态不合适 NullPointException 参数 ...
- Java通过在主循环中判断Boolean来停止线程
Java代码: package Threads; /** * Created by Frank */ public class StopBoolean extends Thread { // 确保变化 ...
- Android M 动态权限获取
新的权限获取方式除了要求像之前版本号一样在AndroidManifest文件里静态申请之外,应用还需依据须要请求权限,方式採用向用户显示一个请求权限的对话框. 这些被动态申请的权限能够在系统设置中被手 ...
- Axure 地区选择(选择省份之后可以选择对应的地级市)
百度网盘:http://pan.baidu.com/s/1c1ZjUPq
- Centos6.5安装ansible2.6.3
需求描述: 管理具有特征性的集群服务器,50台左右,服务都是规划好的!为了更加有效地管理服务器,需要引入协助管理员关系的工具!ansible基于ssh通信不需要安装agent(agentless),使 ...
- 【laravel5.*】详解laravel中的依赖注入
1.下面这个是自定义的类,钉钉扫码登录web 网页授权OAuth2.0,是一个典型的依赖注入参考示例: