• ASP.NET页面执行顺序 (HttpModule,HttpHandler)


    public class HelloWorldModule : IHttpModule
    {
        
    public HelloWorldModule()
        {
        }

        
    public String ModuleName
        {
            
    get { return "HelloWorldModule"; }
        }

        
    // In the Init function, register for HttpApplication
        
    // events by adding your handlers.
        public void Init(HttpApplication application)
        {
            application.BeginRequest 
    +=
                (
    new EventHandler(this.Application_BeginRequest));
            application.EndRequest 
    +=
                (
    new EventHandler(this.Application_EndRequest));
        }

        
    private void Application_BeginRequest(Object source,
             EventArgs e)
        {
        
    // Create HttpApplication and HttpContext objects to access
        
    // request and response properties.
            HttpApplication application = (HttpApplication)source;
            HttpContext context 
    = application.Context;
            context.Response.Write(
    "<h1><font color=red> HelloWorldModule: Beginning of Request</font></h1><hr>");
        }

        
    private void Application_EndRequest(Object source, EventArgs e)
        {
            HttpApplication application 
    = (HttpApplication)source;
            HttpContext context 
    = application.Context;
            context.Response.Write(
    "<hr><h1><font color=red>HelloWorldModule: End of Request</font></h1>");
        }

        
    public void Dispose()
        {
        }
    }

        
    <system.web>
       
    <httpModules>
        
    <add name="HelloWorldModule" type="HelloWorldModule"/>
       
    </httpModules>
        
    </system.web>

    一 asp.net请求的处理过程
    -------------------
    HttpModule 必须要掌握的东西
    HttpHandler 必须要掌握的东西,非常有用
    以上两个的实例
    ---------------------
    asp.net 事件模型机制

    -----------------------

    客户的请求页面由aspnet_isapi.dll这个动态连接库来处理,把请求的aspx文件发送给CLR进行编译执行,然后把Html流返回给浏览器
    --------------------------
    二 页面事件
    执行顺序
    Page_Init:初始化值或连接
    Page_Load:主要使用IsPostBack,该事件主要执行一系列得操作来首次创建asp.net页面或响应
    由投递引起得客户端事件。在此事件之前,已还原页面和控件视图状态。
    Page_DataBind:在页面级别上调用,也可在单个控件中调用。
    DataBind_PreRender:数据绑定预呈现,恰好在保存视图状态和呈现控件之前激发此事件。
    Page_Unload:此事件是执行最终清理工作的。
    非确定事件
    Page_Error:如果在页面处理过程中出现未处理的例外,则激发error事件。
    Page_AbortTransaction:交易事件,事务处理中如果已终止交易,则激发此事件,购物车常用。
    Page_CommitTransaction:如果已成功交易,则激发此事件。
    --------------------------------------------------------
    Global.asax中的事件(执行顺序)
    Application_Start:应用程序启动时激发
    Application_BeginRquest:http请求开始时激发
    Application_AuthenticateRequest: 应用程序批准http请求时激发
    Session_Start: 会话启动时激发
    Application_EndRequest:Htttp请求结束时激发
    Session_End:会话结束时激发
    Application_End:应用程序结束时激发
    Application_Error: 发生错误时激发
    ----------------------
    ISAPI: 向web服务器插入某些组建,扩展功能,增强web服务器功能。
    ISAPI: 扩展,win32的动态链接库,譬如aspnet_isapi.dll,可以把ISAPI扩展看作是一个普通的应用程序,它处理的目标是HTTP请求。
    ISAPI: 过滤器,web服务器把请求传递给相关的过滤器,接下来过滤器可能修改请求,执行某些操作等等。
    ASP.NET请求的处理过程:
    基于管道模型,在模型中ASP.NET把http请求传递给管道中所有的模块。每个模块都接收HTTP请求,并有完全的控制权。一旦请求经过了所有的 HTTP模块,最终被HTTP处理程序处理。HTTP处理程序对请求进行一些处理,并且结果将再次经过模块管道中的HTTP模块。
    -----------
    httpmodule
    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处理程序。

    在以前的ASP时候,当请求一个*.asp页面文件的时候,这个HTTP请求首 先会被一个名为inetinfo.exe进程所截获,这个进程实际上 就是www服务。截获之后它会将这个请求转交给asp.dll进程,这个进程就会解释这个asp页面,然后将解释后的数据流返回给客户端浏览器。其实 ASP.DLL是一个依附在IIS的ISAPI文件,它负责了对诸如ASP文件,ASA等文件的解释执行,
    -------------------------------------


    ASP.NET的HTTP请求处理方法
    当客户端向web服务器请求一个*.aspx的页面文件时,同asp类似,这个http请求也会被inetinfo.exe进程截获(www服务),它判 断文件后缀之后,把这个请求转交给ASPNET_ISAPI.DLL而ASPNET_ISAPI.DLL则会通过一个Http PipeLine的管道,将这个http请求发送给ASPNET_WP.EXE进程,当这个HTTP请求进入ASPNET_WP.EXE进程之 后,asp.net framework就会通过HttpRuntime来处理这个Http请求,处理完毕后将结果返回给客户端。
    ------------------------------------
    当一个http请求被送入到HttpRuntime之后,这个Http请求会继续被送入到一个被称之为HttpApplication Factory的一个容器当中,而这个容器会给出一个HttpApplication实例来处理传递进来的http请求,而后这个Http请求会依次进入 到如下几个容器中:
    HttpModule --> HttpHandler Factory --> HttpHandler
    当系统内部的HttpHandler的ProcessRequest方法处理完毕之后,整个Http Request就被处理完成了,客户端也就得到相应的东东了。
    完整的http请求在asp.net framework中的处理流程:
    HttpRequest-->inetinfo.exe->ASPNET_ISAPI.DLL-->Http Pipeline-->ASPNET_WP.EXE-->HttpRuntime-->HttpApplication Factory-->HttpApplication-->HttpModule-->HttpHandler Factory-->HttpHandler-->HttpHandler.ProcessRequest()
    如果想在中途截获一个httpRequest并做些自己的处理,就应该在HttpRuntime运行时内部来做到这一点,确切的说时在 HttpModule这个容器中做到这个的。
    ----------------------------------------
    -------------------------------------
    系统本身的HttpModule实现一个IHttpModule的接口,当然我们自己的类也能够实现IHttpModule接口,这就可以替代系统的 HttpModule对象了。
    ASP.NET系统中默认的HttpModule:

    DefaultAuthenticationModule 确保上下文中存在 Authentication 对象。无法继承此类。
    FileAuthorizationModule 验证远程用户是否具有访问所请求文件的 NT 权限。无法继承此类。
    FormsAuthenticationModule 启用 ASP.NET 应用程序以使用 Forms 身份验证。无法继承此类。
    PassportAuthenticationModule 提供环绕 PassportAuthentication 服务的包装。无法继承此类。
    SessionStateModule    为应用程序提供会话状态服务。
    UrlAuthorizationModule    提供基于 URL 的授权服务以允许或拒绝对指定资源的访问。无法继承此类。
    WindowsAuthenticationModule 启用 ASP.NET 应用程序以使用 Windows/IIS 身份验证。无法继承此类

    --------------------------------------
    这些系统默认的HttpModule是在文件machine.config中配置的,和我们开发时使用到的web.config的关系是:是在 ASP.NET FRAMEWORK启动处理一个Http Request的时候,它会依次加载machine.config和请求页面所在目录的web.config文件,如果在machine中配置了一个自己 的HttpModule,你仍然可以在所在页面的web.config文件中remove掉这个映射关系。 

     从网上查到是资料,感觉很重要,特此留下
  • 相关阅读:
    DropDownList 禁止选择某一项
    C语言文件操作函数(ANSI)详解(二)
    c语言中break与continue的区别
    指针函数
    C语言文件操作函数(ANSI)详解(一)
    结构体指针
    ASCII\UNICODE编码的区别
    函数调用二维数组例子
    getchar()函数getch()函数区别
    C语言 二维数组做函数参数的几种情况
  • 原文地址:https://www.cnblogs.com/zhangchenliang/p/2046728.html
Copyright © 2020-2023  润新知