【问题标题】:IIS module: Init() is called only once in a website?IIS 模块:Init() 在网站中只调用一次?
【发布时间】:2015-12-08 05:30:13
【问题描述】:

我需要添加一个 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() 是否按我希望的那样工作?

谢谢!

【问题讨论】:

  • 对于任何正在执行的请求,它总是会调用此方法,所以不,这不是应用程序池第一次启动。您可能希望做的是在其中有一个静态变量,以查看它是否真的是第一次被击中,如果不是,请继续执行您需要的操作,否则忽略它。确保在将变量设置为 true 时锁定代码部分
  • @Ahmedilyas 所以 Init() 不能按我希望的方式工作,对吗?如果您发布您的回复作为答案。我会选择它。谢谢!
  • 那是正确的......将在我的回答中解释更多

标签: iis iis-modules


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 2014-10-09
    • 2011-10-06
    • 2016-06-09
    • 1970-01-01
    相关资源
    最近更新 更多