首页 > 代码库 > ASP.NET 请求处理完整过程

ASP.NET 请求处理完整过程

请求过程

1.客户端发送请求给服务器端。

2.首先由服务器端的HTTP.SYS内核模块接受,根据端口分发给IIS(或者其他web服务器软件)。

3.IIS(由一个软件进程,一个w3svc服务组成)接收到请求后,会根据端口分发给指定的工作进程

4.工作进程会对所请求的文件的文件扩展名进行检查,交给对应的扩展程序处理。(如 .aspx、.ascx、.ashx 和 .asmx则交给aspnet_isapi.dll扩展程序)

5.当请求为.aspx时,扩展程序会交给ASPNetRuntime托管环境调用ISAPIRuntime.ProcessRequest(IntPtr ecb)方法,(ecb就是请求的句柄。句柄就是操作系统对一个资源的标识)。

6.ISAPIRuntime的PR方法中 把请求封装成HttpWorkRequest对象 然后调用HttpRuntime.pr方法。

7.在HttpRuntime的PR方法中,把HttpWorkRequest对象封装成HttpContext对象。然后通过HttpApplicationFactory生产一个HttpApplication对象出来。

8.HttpApplication对象会拿着这个HttpContext对象走管线处理请求。

9.在管线请求中,第7和8事件中默认会根据请求实例化实现IHttpHandle的对象A。第11,12事件中,会调用A的PR方法

10.如果A是一般处理程序,则直接调用PR方法。如果是aspx程序,则会走页面生命周期过程。

图:应用程序环境

 

页面生命周期

1.Create Instance 创建所有控件

2.IsPostBack 确定是不是第一次处理该页

3.Init 所有控件都已初始化且已应用所有外观设置后引发

3.ViewState 加载ViewState设置控件值

4.Load 执行所有的Load事件

5.ChangeEvent 执行控件更改的事件

6.Complete 事件

7.PreRender 预呈现页面,最后更改页面的机会

8.SaveState 保存状态放到页面中

9.Render 呈现页面

10.Unload 卸载

 ASP.NET 页面生命周期关系图

 

管线事件

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

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

    • 引发 BeginRequest 事件。

    • 引发 AuthenticateRequest 事件。

    • 引发 PostAuthenticateRequest 事件。

    • 引发 AuthorizeRequest 事件。

    • 引发 PostAuthorizeRequest 事件。

    • 引发 ResolveRequestCache 事件。

    • 引发 PostResolveRequestCache 事件。

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

    • 引发 PostMapRequestHandler 事件。

    • 引发 AcquireRequestState 事件。

    • 引发 PostAcquireRequestState 事件。

    • 引发 PreRequestHandlerExecute 事件。

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

    • 引发 PostRequestHandlerExecute 事件。

    • 引发 ReleaseRequestState 事件。

    • 引发 PostReleaseRequestState 事件。

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

    • 引发 UpdateRequestCache 事件。

    • 引发 PostUpdateRequestCache 事件。

    • 引发 EndRequest 事件。

    • 引发 PreSendRequestHeaders 事件。

    • 引发 PreSendRequestContent 事件。

ASP.NET 请求处理完整过程