当前位置导航:炫浪网>>网络学院>>编程开发>>Visual C#教程

IHttpModule.Init方法被执行多次的原因

发现不少朋友跟我一样,错把IHttpModule.Init拿来当做Application_Start的替代品,在其中做一些应用程序初始化的操作。

    但其实IHttpModule.Init和Global.asax中的Application_Start事件性质是不同的,不能直接拿IHttpModule.Init来代替Application_Start做ASP.NET应用程序的初始化过程。也不能简单的拿Init方法被重复调用来断定是ASP.NET程序发生了重启。

    原因是IHttpModule.Init在ASP.NET响应请求时有可能被重复调用多次,在实际网站运行过程中更是极有可能发生的。

    为什么IHttpModule.Init会被调用多次呢 原因是每个HttpApplication实例同时只能处理一个请求,而ASP.NET是支持一定的并发请求的,所以HttpApplication的实例在不够响应并发请求时会被创建多个来响应不同的请求,而每个HttpApplication实例在被创建后都会创建一组新的HttpModule并调用Init方法。

    而Application_Start只会在第一个HttpApplication对象被创建后调用,后续创建的HttpApplication实例不会触发此事件。

    我想HttpApplication实例的重用是导致IHttpModule的Init方法用途被误解的一个主要原因,因为平时我们调试程序时都是只有一个请求,基本上不可能发生重复执行HttpModule的Init方法的情况。而在实际网站运行环境下,并发请求是很平常的,如果误用了Init方法,可能会导致程序在实际环境下出奇怪问题。

    具体细节可以参考MSDN的《IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述》一文,以下是文章中提供的图片:

    

    也可以使用Refelector反编译System.Web程序集,分析IHttpModule.Init方法的调用关系,

共2页 首页 上一页 1 2 下一页 尾页 跳转到
相关内容
赞助商链接