• 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文件。

  • 相关阅读:
    16进制颜色转普通RGB
    (null)
    GIT配置
    -other linker flags
    cocoapods使用问题集锦(2017-04)
    关于@property与@syntheszie的使用问题
    iOS端一次视频全屏需求的实现(转)
    用C语言进行最基本的socket编程
    http和socket之长连接和短连接区别(转)
    socket,TCP/IP的理解(转)
  • 原文地址:https://www.cnblogs.com/OceanEyes/p/sharepoint-httpmodule-init.html
Copyright © 2020-2023  润新知