SharePoint利用HttpModule的Init方法实现全局初始化
SharePoint利用HttpModule的Init方法实现全局初始化
木宛城主 发表于3年前
SharePoint利用HttpModule的Init方法实现全局初始化
  • 发表于 3年前
  • 阅读 4
  • 收藏 0
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

接上篇

我们知道,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文件。

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 1
博文 222
码字总数 199010
×
木宛城主
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: