SharePoint利用HttpModule的Init方法实现全局初始化
2015-03-02 00:00
405 查看
接上篇
我们知道,HttpRuntime中会对每一个Request创建一个HttpApplication对象(HttpApplicationFactory从一个HttpApplication池来拿)。对于Global.asax,当创建第一个HttpApplication对象才会执行的Application_Start方法。
然后每一个HttpApplication对象会创建HttpModule对象,然后只执行一次Init方法。但在实际场景中,HttpRuntime会根据请求次数创建多个HttpApplication对象,所以每一个对象都会执行一遍Init方法,那怎么实现只执行一次Init方法来实现类似Application_Start方法中程序初始化呢?
我的处理是加个静态标记变量即可。
注意以下这两段代码本身就是针对每一次请求所必要执行的,如BeginRequest对每一次请求可以进行URL Rewrite。所以把它独立开来。
我们知道,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方法实现全局初始化
- SharePoint利用HttpModule的Init方法实现全局初始化
- 利用HttpModule实现浏览器版本控制
- 利用HttpModule实现防sql注入
- 利用自定义IHttpModule来实现URL地址重写
- 在ASP.NET中重写URL 方法三:在IIS7中使用HttpModule 实现无扩展名的URL重写
- Spring-Bean的初始化(init方法和实现org.springframework.beans.factory.InitializingBean接口)
- 利用HttpModule实现浏览器版本控制
- 通过实现IHttpModule初始化Nhibernate的Session
- Objective-C 编程语言(3) 定义类---分配并初始化对象,init方法的返回值,初始化方法的实现
- 利用IWebBrowser2接口的Navigate2方法实现Http POST传输
- 在 ASP.NET WebForms/MVC 中利用 HttpModule 添加全局站点统计(CNZZ、百度统计、Google Analytics等)脚本
- 利用HttpModule实现防sql注入
- (原创)在 ASP.NET 中,如何巧用 HttpModule ,以实现系统全局登录逻辑判断,高手慎入
- 利用HttpModule和forms身份验证,实现角色验证控制
- 利用HttpModule实现防sql注入
- 利用HttpModule实现防sql注入
- asp.net简单实现利用HttpModule实现防sql注入
- IHttpModule.Init方法被执行多次的原因
- 利用HttpWebRequest实现POST和GET方法