前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SharePoint利用HttpModule的Init方法实现全局初始化

SharePoint利用HttpModule的Init方法实现全局初始化

作者头像
用户1161731
发布2018-01-11 13:25:34
6860
发布2018-01-11 13:25:34
举报
文章被收录于专栏:木宛城主

接上篇 我们知道,HttpRuntime中会对每一个Request创建一个HttpApplication对象(HttpApplicationFactory从一个HttpApplication池来拿)。对于Global.asax,当创建第一个HttpApplication对象才会执行的Application_Start方法。 然后每一个HttpApplication对象会创建HttpModule对象,然后只执行一次Init方法。但在实际场景中,HttpRuntime会根据请求次数创建多个HttpApplication对象,所以每一个对象都会执行一遍Init方法,那怎么实现只执行一次Init方法来实现类似Application_Start方法中程序初始化呢? 我的处理是加个静态标记变量即可。

解决方案

现在项目中需要有一个自动清理过期的数据的线程,需要实时清理脏数据,可以在Init中这样实现:

代码语言:javascript
复制
     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。所以把它独立开来。

代码语言:javascript
复制
 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文件。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2013-08-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 解决方案
  • 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档