首页 > 代码库 > 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 卸载
管线事件
对请求进行验证,将检查浏览器发送的信息,并确定其是否包含潜在恶意标记。 有关更多信息,请参见 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 请求处理完整过程