我需要添加一个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()是否正常工作吗?
谢谢!
答案 0 :(得分:1)
对于正在执行的任何请求,它总是会调用此方法,所以不会,这不是第一次应用程序池旋转。您可能希望做的是在那里有一个静态变量,看它是否真的是第一次被击中,如果没有,继续你需要的东西,否则忽略它。确保在将变量设置为true时锁定代码部分。
请记住,IIS具有网站使用的应用程序池(一般而言)。将有多个并发请求进入IIS进行处理,会发生什么?应用程序池执行以向网站提供请求,因此对于HttpModule的Init()将执行多次“命中”,但是每个应用程序执行一次,如果这是有意义的。
他们每个人都会初始化自己的模块列表。
你可以选择在全局asax中使用Application_Start事件,每个应用程序只执行一次(当应用程序池旋转并提交请求时) - 也许你可以根据需要使用它,会是一个更好的选择。