IIS模块:Init()在网站中只调用一次?

时间:2015-09-11 15:32:36

标签: iis iis-modules

我需要添加一个IIS模块进行一些处理。这是我的模块:

namespace MyNamespace
{
    public class MyModule : IHttpModule
    {
        #region IHttpModule Members

        public void Dispose()
        {
        }

        public void Init(HttpApplication context)
        {
            //I hope to do some work here ONLY once for all requests

            context.ReleaseRequestState += new EventHandler(myHandler);
        }

        #endregion

        public void myHandler(Object source, EventArgs e)
        {
            //do some work...
        }
    }
}

我需要在Init()方法中做一些耗费资源的工作。我希望在网站中只调用一次Init,并且只有在IIS管理器中重新启动网站时才会再次调用它。

专家可以告诉我Init()是否正常工作吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

对于正在执行的任何请求,它总是会调用此方法,所以不会,这不是第一次应用程序池旋转。您可能希望做的是在那里有一个静态变量,看它是否真的是第一次被击中,如果没有,继续你需要的东西,否则忽略它。确保在将变量设置为true时锁定代码部分。

请记住,IIS具有网站使用的应用程序池(一般而言)。将有多个并发请求进入IIS进行处理,会发生什么?应用程序池执行以向网站提供请求,因此对于HttpModule的Init()将执行多次“命中”,但是每个应用程序执行一次,如果这是有意义的。

他们每个人都会初始化自己的模块列表。

你可以选择在全局asax中使用Application_Start事件,每个应用程序只执行一次(当应用程序池旋转并提交请求时) - 也许你可以根据需要使用它,会是一个更好的选择。