.NET 请求、事件 处理流程

页面事件
执行顺序
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等文件的解释执行,
-------------------------------------

IHttpModuleIHttpHandler的区别

1.先后次序.先 IHttpModule,后 IHttpHandler. 注:Module要看你响应了哪个事件,一些事件是在Handler之前运行的,一些是在Handler之后运行的

2.对请求的处理上:
IHttpModule是属于大小通吃类型,无论客户端请求的是什么文件,都会调用到它;例如aspx,rar,html的请求.
IHttpHandler则属于挑食类型,只有ASP.net注册过的文件类型(例如aspx,asmx等等)才会轮到调用它.

3. IHttpHandler按照你的请求生成响应的内容, IHttpModule对请求进行预处理,如验证、修改、过滤等等,同时也可以对响应进行处理 HttpHandler是HTTP请求的处理中心,真正地对客户端请求的服务器页面做出编译和执行,并将处理过后的信息附加在HTTP请求信息流中再次返回到 HttpModule中。
HttpHandlerHttpModule不同,一旦定义了自己的 HttpHandler类,那么它对系统的 HttpHandler的关系将是“覆盖”关系。

4 IHttpModule :
Init 方法:系统初始化的时候自动调用,这个方法允许HTTP模块向 HttpApplication 对象中的事件注册自己的事件处理程序。
Dispose方法: 这个方法给予HTTP模块在对象被垃圾收集之前执行清理的机会。此方法一般无需编写代码。
-------------------------------------


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
当系统内部的 HttpHandlerProcessRequest方法处理完毕之后,整个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掉这个映射关系。
public class HelloWorldModule : IHttpModule
{
public HelloWorldModule()
{
}

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

// 在init函数中登记的 HttpApplication加入处理程序事件
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>
");
}

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

public void Dispose()
{
}
}

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

深入 HttpModule
一个Http请求在被ASP.NET Framework捕获之后会依次交给 HttpModule以及 HttpHandler来处理。hm与hh之间不是完全独立的,实际上,http请求在hm传递的过程中会在某个事件内将控制权转交给hh的,而真正的处理在 HttpHandler中执行完成后, HttpHandler会再次将控制权交还给 HttpModule
上面的代码中的 HttpModule的Init()中的参数是 HttpApplication类型,它具有许多事件,包括 BeginRequest, EndRequestAuthentiacteRequest 等等。

IHttpHandler
它 是asp.net Framework提供的一个接口,定义了如果要实现一个Http请求的处理所需要必须实现的一些系统约定。也就是说,如果你想要自行处理某些类型的 HTTP请求信息流的话,你需要实现这些系统约定才能做到。譬如一个*.aspx文件,用来处理此类型的Http请求,ASP.NET FRAMEWORK将会交给一个名为System.Web.UI. PageHandlerFactoryHttpHandler类来处理。
HH和HM一样,系统会在最初始由ASP.NET FRAMEWORK首先加载machine.config中的 HttpHandler,而后会加载Web应用程序所在目录的web.config中的用户自定义的 HttpHandler类。但是系统与我们自定义的HH之间的关系是"覆盖"的,也就是说如果我们自定义了一个针对"*.aspx"的 HttpHandler类的话,那么系统会将对此http请求的处理权完全交给我们自己定义的这个 HttpHandler类来处理,而我们自己的 HttpHandler类则需要自己完全解析这个Http请求,并作出处理。
IHttpHandler接口中最重要的方法 ProcessRequest,这个方法就是 HttpHandler用来处理一个Http请求,当一个Http请求经过由 HttpModule容器传递到 HttpHandler容器中的时候,framework会调用 HttpHandlerProcessRequest方法来做对这个Http请求做真正的处理。
framework实际上并不是直接把相关页面的HTTP请求定位到一个内部默认的 IHttpHandler容器之上的,而是定位到了其 内部默认的 IHttpHandler Factory上了。 IHttpHandler Factory的作用就是对很多系统已经实现了的 IHttpHandler容器进行调度和管理的,这样做的优点是大大增强了系统的负荷性,提升了效率。

你可能感兴趣的:(.net)