由一道面试题引发的 HttpModule,HttpHandler与IHttpAsyncHandler 详解

  上周一个同事去面试, 回来他回问我这样一道题目:asp.net里面,如果有很多页面都有重复的动作(比如页面加载的时候进行用户验证啥的),你怎么简化?

 1.基类法

     当时只想到了写一个页面基类BasePage继承自Page类,然后所有这些页面都再从BasePage类继承,而不是直接从Page继承,这样再把所有的这些重复动作的代码都写在这个BasePage类中,这样就应该能达到了简化的作用。示例代码如下:

  

基类法
    public class BasePage : Page
    {
        
//可以override相应的事件,执行这些重复的操作
        protected override void OnPreInit(EventArgs e)
        {
            
base.OnPreInit(e);
        }
    }

   
//实际使用的类,继承BasePage而不是直接继承Page
    public partial class NewPage: BasePage
    {
       
//....
    }

   

     2.HttpModule

     同事说他也是这么说的,但是他说这个答案面试官并不是太满意,于是我突然想到,应该可以用HttpModule来实现。但是我对HttpModule实在不太熟悉,于是上网查阅了一下相关的资料,才明白了HttpModule的具体用法。

 

     

     ASP.NET对请求处理的过程:
当请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给 ASPNET_ISAPI.dll,ASPNET_ISAPI.dll会通过http管道(Http PipeLine)将请求发送给ASPNET_WP.exe进程,在ASPNET_WP.exe进程中通过HttpRuntime来处理这个请求,处理完 毕将结果返回客户端。
    inetinfo.exe进程:是www服务的进程,IIS服务和ASPNET_ISAPI.DLL都寄存在此进程中。
    ASPNET_ISAPI.DLL:是处理.aspx文件的win32组件。其实IIS服务器是只能识别.html文件的,当IIS服务器发现被请求的文件是.aspx文件时,IIS服务器将其交给aspnet_isapi.dll来处理。
    aspnet_wp.exe进程:ASP.NET框架进程,提供.net运行的托管环境,.net的CLR(公共语言运行时)就是寄存在此进程中。

ASP.NET Framework处理一个Http Request的流程:
    HttpRequest-->inetinfo.exe-->ASPNET_ISAPI.dll-->ASPNET_WP.exe-->HttpRuntime-->HttpApplication Factory-->HttpApplication-->HttpModule-->HttpHandler Factory-->HttpHandler-->HttpHandler.ProcessRequest()

      ASP.NET请求处理过程是基于管道模型的,这个管道模型是由多个HttpModule和HttpHandler组成,ASP.NET 把http请求依次传递给管道中各个HttpModule,最终被HttpHandler处理,处理完成后,再次经过管道中的HTTP模块,把结果返回给 客户端。我们可以在每个HttpModule中都可以干预请求的处理过程。
注意:在http请求的处理过程中,只能调用一个HttpHandler,但可以调用多个HttpModule。

当请求到达HttpModule的时候,系统还没有对这个请求真正处理,但是我们可以在这个请求传递到处理中心(HttpHandler)之前附加一些其 它信息,或者截获的这个请求并作一些额外的工作,也或者终止请求等。在HttpHandler处理完请求之后,我们可以再在相应的HttpModule中 把请求处理的结果进行再次加工返回客户端。

    详情参见这三篇文章:

 

 

       然后由HttpModule又看到了HttpHandler的相关用法。在看MSDN的过程中,意识到这些事件的处理和Application和页面的生命周期息息相关。因而又学习了这二个方面相关的东西。详情参见这二个链接:

     3. 不成熟的想法AOP

    后来想想这个方法貌似不太对,不知道还有没有更好的办法。

 

    第一篇和技术有关系的博文。穿插大量链接,权当学习的记录,以后备查吧。

posted @ 2010-05-12 14:45  KevinZhou  阅读(2251)  评论(2编辑  收藏  举报