博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SharePoint利用HttpModule的Init方法实现全局初始化
阅读量:4356 次
发布时间:2019-06-07

本文共 2099 字,大约阅读时间需要 6 分钟。

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

转载于:https://www.cnblogs.com/OceanEyes/p/sharepoint-httpmodule-init.html

你可能感兴趣的文章
java5,java6新特性
查看>>
【LOJ】#2290. 「THUWC 2017」随机二分图
查看>>
SSL-ZYC 活动安排
查看>>
Git clone 报错 128
查看>>
在Python中执行普通除法
查看>>
编译原理(第三版) 语法分析器
查看>>
c# 动态绘制直线和曲线
查看>>
Spring理解?
查看>>
删除无限循环的文件夹-删除递归文件夹
查看>>
Test
查看>>
C# 整理
查看>>
AngularJS中使用$resource
查看>>
[poj3261]Milk Patterns(后缀数组)
查看>>
[luogu3369]普通平衡树(fhq-treap模板)
查看>>
题解 P2799 【国王的魔镜】
查看>>
写写代码,注意注意细节
查看>>
css Backgroud-clip (文字颜色渐变)
查看>>
安装 OpenSSL 工具
查看>>
用长微博工具发布长微博
查看>>
大庆金桥帆软报表案例
查看>>