• 深入理解HttpModule和HttpHandler


    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中把请求处理的结果进行再次加工返回客户端。

    ----------------------
      ISAPI: 向web服务器插入某些组建,扩展功能,增强web服务器功能。
      ISAPI: 扩展,win32的动态链接库,譬如aspnet_isapi.dll,可以把ISAPI扩展看作是一个普通的应用程序,它处理的目标是HTTP请求。
      ISAPI: 过滤器,web服务器把请求传递给相关的过滤器,接下来过滤器可能修改请求,执行某些操作等等。
    ASP.NET请求的处理过程:
      基于管道模型,在模型中ASP.NET把http请求传递给管道中所有的模块。每个模块都接收HTTP请求,并有完全的控制权。一旦请求经过了所有的HTTP模块,最终被HTTP处理程序处理。HTTP处理程序对请求进行一些处理,并且结果将再次经过模块管道中的HTTP模块。
    -----------
      ISAPI过滤器(筛选器):IIS本身是不支持动态页面的,也就是说他仅仅支持静态HTML页面的内容,对于.asp .aspx .cgi .php等,IIS并不知道如果处理这些后缀标记,它就会把它当作文本,丝毫不做处理发送到客户端。为了解决这个问题,IIS有一种机制,叫做ISAPI的过滤器。它是一个COM组件。
      ASP.NET服务在注册到IIS的时候,会把每个扩展可以处理的文件扩展名注册到IIS里面(如*.ascx *.aspx等)。扩展启动后,就根据定义好的方式来处理IIS所不能处理的文件,然后把控制权跳转到专门处理代码的进程中,asp.net中是aspnet_isapi.dll。让这个进程开始处理代码,生成标准的HTML代码,生成后把这些代码加入到原有的HTML中,最后把完整的HTML返回给IIS,IIS再把内容发送到客户端。
    ----------------
    HttpModule
      Http模块实现了过滤器(ISAPI filter)的功能,它是实现了System.Web.IHttpModule接口的.net组件。。这些组件通过在某些事件中注册自身,把自己插入到ASP.NET请求处理管道。当这些事件发生的时候,ASP.NET调用对请求有兴趣的HTTP模块,这样该模块就能处理请求了。有时候需要过虑一下http请求,注意它不是覆盖其他的包括系统自带的HttpModule,在Machine.config中配置完成。
    --------------------------------------
    HttpHandler
      它实现了ISAPI Extention的功能,它处理请求(Request)的信息和发送响应(Response)。HttpHandler功能的通过必须实现IHttpHandler接口。HTTP处理程序是实现System.Web.IHttpHandler接口的.NET组件。任何实现了该接口的类都可以用于处理输入的Http请求。它就是Http处理程序。

    下面我们看一下如何使用HttpModule来实现我们日常的应用:
        HttpModule通过在某些事件中注册,把自己插入ASP.NET请求处理管道。当这些事件发生的时候,ASP.NET调用对相应的HTTP模块,这样该模块就能处理请求了。

    1、向每个页面动态添加一些备注或说明性的文字:
          
          //第一步:创建一个类库ClassLibrary831。
          
    //第二步:编写一个类实现IHttpModule接口
                    class TestModule:IHttpModule
                    {
                        
    public void Dispose()
                        {
                        }
                        
    public void Init(HttpApplication context)
                        {
                        }
                    } 
          
    //第三步:在Init事件中注册EndRequest事件,并实现事件处理方法
                   class TestModule:IHttpModule
                    {
                        
    public void Dispose(){}
                        
    public void Init(HttpApplication context)
                        {
                            context.EndRequest 
    += new EventHandler(context_EndRequest);
                        }
                        
    void context_EndRequest(object sender, EventArgs e)
                        {
                            HttpApplication ha 
    = (HttpApplication)sender;
                            ha.Response.Write(
    "<!--这是每个页面都会动态生成的文字。--grayworm-->");
                        }
                    } 
          
    //第四步:在Web.Conofig中注册一下这个HttpModule模块
              <httpModules>
               
    <add name="TestModule" type="ClassLibrary831.TestModule,ClassLibrary831"></add>
              
    </httpModules> 
      
    代码
    2、身份检查
         //第一步:创建一个类库ClassLibrary831。
        
    //第二步:编写一个类实现IHttpModule接口
                    class TestModule:IHttpModule
                    {
                        
    public void Dispose()
                        {
                        }
                        
    public void Init(HttpApplication context)
                        {
                        }
                    } 
           
    //第三步:在Init事件中注册PreRequestHandlerExecute事件,并实现事件处理方法
                   class AuthenticModule:IHttpModule
                    {
                        
    public void Dispose(){}
                        
    public void Init(HttpApplication context)
                        {
                            context.PreRequestHandlerExecute 
    += new EventHandler(context_PreRequestHandlerExecute);
                        }
                        
    void context_PreRequestHandlerExecute(object sender, EventArgs e)
                        {
                            HttpApplication ha 
    = (HttpApplication)sender;
                            
    string path = ha.Context.Request.Url.ToString();
                            
    int n = path.ToLower().IndexOf("Login.aspx"); 
                            
    if (n == -1//是否是登录页面,不是登录页面的话则进入{}
                            {
                                
    if (ha.Context.Session["user"== null//是否Session中有用户名,若是空的话,转向登录页。
                                {
                                    ha.Context.Response.Redirect(
    "Login.aspx?source=" + path);
                                }
                            }
                        }
                    } 
           
    //第四步:在Login.aspx页面的“登录”按钮中加入下面代码
                    protected void Button1_Click(object sender, EventArgs e)
                    {
                        
    if(true)    //判断用户名密码是否正确
                        { 
                            
    if (Request.QueryString["source"!= null)
                            {
                                
    string s = Request.QueryString["source"].ToLower().ToString();   //取出从哪个页面转来的
                                Session["user"= txtUID.Text;
                                Response.Redirect(s); 
    //转到用户想去的页面
                            }
                            
    else
                            {
                                Response.Redirect(
    "main.aspx");    //默认转向main.aspx
                            }
                        } 
                    } 
          
    //第五步:在Web.Conofig中注册一下这个HttpModule模块
              <httpModules>
               
    <add name="TestModule" type="ClassLibrary831.TestModule,ClassLibrary831"></add>
              
    </httpModules>  


     
  • 相关阅读:
    AndRodi Strudio中的按钮时件
    Intent(三)向下一个活动传递数据
    Intent(二)隐式调用intent
    用PopupWindow做下拉框
    环形进度条
    Android Studio分类整理res/Layout中的布局文件(创建子目录)
    Android无需申请权限拨打电话
    使用ViewPager切换Fragment时,防止频繁调用OnCreatView
    定制 黑色描边、白色背景、带圆角 的背景
    Android 底部弹出Dialog(横向满屏)
  • 原文地址:https://www.cnblogs.com/chjw8016/p/1690321.html
Copyright © 2020-2023  润新知