·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设开发 >> ASP.NET网站开发 >> ASP.NET 运行机制续(完结)

ASP.NET 运行机制续(完结)

作者:佚名      ASP.NET网站开发编辑:admin      更新时间:2022-07-23

asp.net 运行机制续(完结)

上一篇说到applicationInstance会执行一些列的事件。下面是我在msdn上找到有关asp.net程序生命周期相关的描述及图片

声明周期的起始

ASP.NET 应用程序的生命周期以浏览器向 Web 服务器(对于 ASP.NET 应用程序,通常为 IIS)发送请求为起点。ASP.NET 是 Web 服务器下的 ISAPI 扩展。Web 服务器接收到请求时,会对所请求的文件的文件扩展名进行检查,确定应由哪个 ISAPI 扩展处理该请求,然后将该请求传递给合适的 ISAPI 扩展。ASP.NET 处理已映射到其上的文件扩展名,如 .aspx、.ascx、.ashx 和 .asmx。

ASP.NET 接收对应用程序的第一个请求

当 ASP.NET 接收到对应用程序中任何资源的第一个请求时,名为ApplicationManager的类会创建一个应用程序域。应用程序域为全局变量提供应用程序隔离,并允许单独卸载每个应用程序。在应用程序域中,将为名为HostingEnvironment的类创建一个实例,该实例提供对有关应用程序的信息(如存储该应用程序的文件夹的名称)的访问。

为每个请求创建 ASP.NET 核心对象

创建了应用程序域并对HostingEnvironment对象进行了实例化之后,ASP.NET 将创建并初始化核心对象,如HttpContext、HttPRequest和HttpResponse。HttpContext类包含特定于当前应用程序请求的对象,如HttpRequest和HttpResponse对象。HttpRequest对象包含有关当前请求的信息,包括 Cookie 和浏览器信息。HttpResponse对象包含发送到客户端的响应,包括所有呈现的输出和 Cookie。

将HttpApplication对象分配给请求

初始化所有核心应用程序对象之后,将通过创建HttpApplication类的实例启动应用程序。如果应用程序具有 Global.asax 文件,则 ASP.NET 会创建 Global.asax 类(从HttpApplication类派生)的一个实例,并使用该派生类表示应用程序。

注意注意第一次在应用程序中请求 ASP.NET 页或进程时,将创建HttpApplication的一个新实例。不过,为了尽可能提高性能,可对多个请求重复使用HttpApplication实例。

创建HttpApplication的实例时,将同时创建所有已配置的模块。例如,如果将应用程序这样配置,ASP.NET 就会创建一个sessionStateModule模块。创建了所有已配置的模块之后,将调用HttpApplication类的Init方法。

由HttpApplication管线处理请求。

在处理该请求时将由HttpApplication类执行以下事件。希望扩展HttpApplication类的开发人员尤其需要注意这些事件。

  1. 对请求进行验证,将检查浏览器发送的信息,并确定其是否包含潜在恶意标记。有关更多信息,请参见ValidateRequest和脚本侵入概述。

  2. 如果已在 Web.config 文件的UrlMappingsSection节中配置了任何 URL,则执行 URL 映射。

  3. 引发BeginRequest事件;第一个事件

  4. 引发AuthenticateRequest事件;验证请求,开始检查用户的身份,一把是获取请求的用户信息

  5. 引发PostAuthenticateRequest事件;用户身份已经检查完毕,检查完成后可以通过HttpContext的User属性获取到,微软内置的身份验证机制,平时很少用到

  6. 引发AuthorizeRequest事件;开始进行用户权限检查,如果用户没有通过上面的安全检查,一般会直接调至EndRequest事件,也就是直接跳至最后一个事件

  7. 引发PostAuthorizeRequest事件;用户请求已经获取授权

  8. 引发ResolveRequestCache事件;缓存,如果存在以前处理的缓存结果,则不再进行请求处理工作,返回缓存结果

  9. 引发PostResolveRequestCache事件;缓存检查结束

  10. 根据所请求资源的文件扩展名(在应用程序的配置文件中映射),选择实现IHttpHandler的类,对请求进行处理。如果该请求针对从Page类派生的对象(页),并且需要对该页进行编译,则 ASP.NET 会在创建该页的实例之前对其进行编译;创建所请求的前台页面类

  11. 引发PostMapRequestHandler事件;已经创建处理请求的处理器对象(IHttpHandler)

  12. 引发AcquireRequestState事件;获取请求状态,一般用于获取session

  13. 引发PostAcquireRequestState事件。已经获取到了session,如果获取到,则将session的值封装到httpcontext中的session属性中去,

  14. 引发PreRequestHandlerExecute事件。以为上个事件已经封装了session信息,所以接下来就是验证身份信息的最好位置,如果不通过,直接处理,提高效率。这里也是准备执行处理程序,及调用HttpContext中Handler属性的ProcessRequest

  15. 为该请求调用合适的IHttpHandler类的ProcessRequest方法(或异步版IHttpAsyncHandler.BeginProcessRequest)。例如,如果该请求针对某页,则当前的页实例将处理该请求。

  16. 引发PostRequestHandlerExecute事件;页面的ProcessRequest方法执行完成

  17. 引发ReleaseRequestState事件;准备释放请求状态session

  18. 引发PostReleaseRequestState事件;已经释放请求状态

  19. 如果定义了Filter属性,则执行响应筛选。

  20. 引发UpdateRequestCache事件;更新缓存

  21. 引发PostUpdateRequestCache事件;更新缓存完毕

  22. 引发EndRequest事件;结束请求

  23. 引发PreSendRequestHeaders事件;可通过发送的头信息设置参数,例如将类型设置为text/plain等

  24. 引发PreSendRequestContent事件;处理数据,如配置压缩,则可在这里对数据进行压缩发送

好了,不贴人家的东西了,感兴趣的可以到原网站去看一下。我们重点就是看一下HttpApplication管线处理请求。下面是对事件的解释

事件
名称说明
公共事件AcquireRequestState当 ASP.NET 获取与当前请求关联的当前状态(如会话状态)时发生。
公共事件AuthenticateRequest当安全模块已建立用户标识时发生。
公共事件AuthorizeRequest当安全模块已验证用户授权时发生。
公共事件BeginRequest在 ASP.NET 响应请求时作为 HTTP 执行管线链中的第一个事件发生。
公共事件Disposed在释放应用程序时发生。
公共事件EndRequest在 ASP.NET 响应请求时作为 HTTP 执行管线链中的最后一个事件发生。
公共事件Error当引发未经处理的异常时发生。
公共事件LogRequest恰好在 ASP.NET 为当前请求执行任何记录之前发生。
公共事件MapRequestHandler基础结构。在选择了用来响应请求的处理程序时发生。
公共事件PostAcquireRequestState在已获得与当前请求关联的请求状态(例如会话状态)时发生。
公共事件PostAuthenticateRequest当安全模块已建立用户标识时发生。
公共事件PostAuthorizeRequest在当前请求的用户已获授权时发生。
公共事件PostLogRequest在 ASP.NET 处理完LogRequest事件的所有事件处理程序后发生。
公共事件PostMapRequestHandler在 ASP.NET 已将当前请求映射到相应的事件处理程序时发生。
公共事件PostReleaseRequestState在 ASP.NET 已完成所有请求事件处理程序的执行并且请求状态数据已存储时发生。
公共事件PostRequestHandlerExecute在 ASP.NET 事件处理程序(例如,某页或某个 xml Web service)执行完毕时发生。
公共事件PostResolveRequestCache在 ASP.NET 跳过当前事件处理程序的执行并允许缓存模块满足来自缓存的请求时发生。
公共事件PostUpdateRequestCache在 ASP.NET 完成缓存模块的更新并存储了用于从缓存中为后续请求提供服务的响应后,发生此事件。
公共事件PreRequestHandlerExecute恰好在 ASP.NET 开始执行事件处理程序(例如,某页或某个 XML Web services)前发生。
公共事件PreSendRequestContent恰好在 ASP.NET 向客户端发送内容之前发生。
公共事件PreSendRequestHeaders恰好在 ASP.NET 向客户端发送 HTTP 标头之前发生。
公共事件ReleaseRequestState在 ASP.NET