开发者社区> 浅蓝丶遠行> 正文

[译] ASP.NET 生命周期 – ASP.NET 请求生命周期(二)

简介: ASP.NET 请求生命周期 全局应用类也可以用来跟踪每个独立请求的生命周期,包括请求从 ASP.NET 平台传递到 MVC 框架。ASP.NET 框架会创建一个定义在 Global.asax 文件中的 MvcApplication 类的实例,并使用它当中定义的事件来引导请求,直到产生响应并发送到浏览器中。
+关注继续查看

ASP.NET 请求生命周期

全局应用类也可以用来跟踪每个独立请求的生命周期,包括请求从 ASP.NET 平台传递到 MVC 框架。ASP.NET 框架会创建一个定义在 Global.asax 文件中的 MvcApplication 类的实例,并使用它当中定义的事件来引导请求,直到产生响应并发送到浏览器中。这些事件并不直接供应用开发者使用,它们是供 ASP.NET 框架执行请求处理的。

请求生命周期是由一系列事件描述的,而这些事件描述了一个请求从接收到响应发出的整个过程。在我们创建自己的模块或者处理器的时候,我们就会使用到这些事件,我们也可以使用这些事件来调试因 ASP.NET 组件之间交互引起的复杂问题。MVC 框架中包含了一个模块和一个处理器。模块是用来阻塞请求来查看文件,处理器是用来定位 controller 和 action 方法的组件。

理解请求生命周期

Application_Start 和 Application_End 方法并不会在 MvcApplication 实例中被调用。相反,ASP.NET 框架会触发一系列的事件,这些事件用来描述 请求生命周期

名称 描述
BeginRequest 当新的请求接收到时触发的第一个事件。
AuthenticateRequest
PostAuthenticateRequest
在核实谁当前请求的用户的时候,AuthenticateRequest 事件会被触发。当所有的事件处理器处理完之后,PostAuthenticateRequest 会被触发。
AuthorizeRequest
PostAuthorizeRequest
在授权请求的时候会触发 AuthorizeRequest。当所有的事件处理器处理完成之后,PostAuthorizeRequest 会触发。
ResolveRequestCache
PostResolveRequestCache
当从缓存的数据中解析请求的时候会触发 ResolveRequestCache。当事件处理器处理完成之后,会触发 PostResolveRequestCache 事件。
MapRequestHandler
PostMapRequestHandler
当 ASP.NET 框架想要为请求定位一个处理器的时候会触发 MapRequestHandler 事件。一旦处理器选中之后就会触发 PostMapRequestHandler 事件。
AcquireRequestState
PostAcquireRequestState
在获取与当前请求相关的状态数据(比如会话状态)的时候触发 AcquireRequestState 事件。当所有的时间处理器处理完毕之后,PostAcquireRequestState 会被触发。
PreRequestHandlerExecute
PostRequestHandlerExecute
在处理器被要求处理请求之前和之后立即调用这两个事件。
ReleaseRequestState
PostReleaseRequestState
当关联当前请求的状态数据在请求处理的过程中不再需要的时候就会触发 ReleaseRequestState。当事件处理器完成请求的时候,PostReleaseRequestState 事件就会触发。
UpdateRequestCache 在模块负责缓存并更新它们状态的时候触发本事件。
LogRequest
PostLogRequest
这个事件触发的时候提供了记录当前请求详细信息的机会。当所有的事件处理完成之后,PostLogRequest 会被触发。
EndRequest 在当前请求处理完毕并且响应准备发送到浏览器之前触发这个事件。
PreSendRequestHandlers 仅在 HTTP 报文头发送到浏览器之前触发这个事件。
PreSendRequestContent 在响应报文头发送出去而响应内容没有发送到浏览器之前触发这个事件。
Error 在错误发生的时候会触发这个事件,这可能发生在请求处理的任何一个节点上。

HttpApplication 对象的请求生命周期ASP.NET 框架会创建多个 MvcApplication 类的实例来处理请求,这些实例也可以反复使用以便在它们的生命中可以处理多个请求。ASP.NET 框架有绝对的自由在需要的时候创建 MvcApplication 类的实例,在不需要的时候也可以销毁这些实例。这就意味着,我们编写的全局应用类 必须 能够让多个实例并存,并且这些实例可以在一个时间内用来连续处理多个请求,因此,我们仅需要担心的就是怎么存取它们共享的数据对象。

ASP.NET 框架触发的事件描绘了一个请求的处理生命周期的图表。我们可以在全局应用类,一个模块,或者一个处理器中处理这些事件。

理解模块与处理器

接下来,我将会向你展示如何在全局应用类中直接响应请求生命周期的事件。这对于了解生命周期事件是一个很好的开始,但这仅仅适用于简单的请求上的交互。任何复杂的请求处理功能都倾向于使用很多的生命周期事件,这就意味着全局应用类很快就会变得杂乱不堪。ASP.NET 框架为了解决这样的问题引入了 模块,它是一个自包含的类,可以接收到生命周期中的事件并且可以监测和处理请求。许多重要的 ASP.NET 平台服务都依赖于模块功能来在其生命周期之前能够预处理请求。举个例子,比如状态数据与安全服务,需要使用到模块来响应事件,比如 AcquireRequestState 和 AuthencticateRequest 会在 MVC 框架处理这个请求之前为其添加数据。模块可以与请求进行互动,包括与其相关联的响应——生命周期中的任何一个节点。

ASP.NET 框架同样支持一个组件叫做 处理器。处理器负责给一个请求生成对应的响应。处理器对于 MVC 框架就是负责定位 controller 和 action 方法来服务请求并渲染 action 方法指定的视图的模块。ASP.NET 框架可以支持多个处理器,这就是为什么可以将多种开发框架混合起来放在一起的原因,比如 MVC, Web API, 和 Web Forms。处理器与四个请求生命周期相关。MapRequestHandler 和 PostMapRequestHandler 事件会分别在为一个请求选中好处理器之前和之后触发,PreRequestHandlerExecute 和 PostRequestHandlerExecute 事件会分别在要求为当前请求生成一个响应的之前和之后执行。

在这里介绍模块和处理器有助于更详细地描述请求生命周期:

向生命周期中添加请求处理过程图表

图 1 - 向生命周期中添加请求处理过程图表

不要担心这很复杂,在解释了这些事件是怎么被处理的,多个 ASP.NET 平台服务是怎么实现的之后,这一切都会变得很明朗。

注意到,全局应用类即会被应用实例化,也会被请求生命周期实例化。不仅 ASP.NET 框架会创建多个实例来同时服务请求,也会创建多个实例来支持每一个生命周期。

[根据 Adam Freeman – Pro ASP.NET MVC 5 Platform 选译]

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
ASP.NET中HTTP请求(Request)、响应(Response)以及状态管理讲解
ASP.NET中HTTP请求(Request)、响应(Response)以及状态管理讲解
137 0
ASP.NET Core获取请求完整的Url
ASP.NET Core获取请求完整的Url
145 0
4.1ASP.NET Core请求过程「深入浅出ASP.NET Core系列」
原文:4.1ASP.NET Core请求过程「深入浅出ASP.NET Core系列」 希望给你3-5分钟的碎片化学习,可能是坐地铁、等公交,积少成多,水滴石穿,谢谢关注。 HTTP请求过程 这里展示整体的HTTP请求的过程,这里化繁为简,保留了主干流程: 从浏览器输入域名开始,这里忽略了建立TCP的3次握手,向服务器发起HTTPRequest请求,服务器接受到之后,会触发服务器对网站的动态解析,然后把生成的网页信息通过HTTPResponse返回给用户,内部包含HTML的Body,Head等信息,最后就是浏览器对这些HTML信息进行内部引擎渲染的过程了。
974 0
4.1ASP.NET Core请求过程「深入浅出ASP.NET Core系列」
希望给你3-5分钟的碎片化学习,可能是坐地铁、等公交,积少成多,水滴石穿,谢谢关注。 HTTP请求过程 这里展示整体的HTTP请求的过程,这里化繁为简,保留了主干流程: 从浏览器输入域名开始,这里忽略了建立TCP的3次握手,向服务器发起HTTPRequest请求,服务器接受到之后,会触发服务器对网站的动态解析,然后把生成的网页信息通过HTTPResponse返回给用户,内部包含HTML的Body,Head等信息,最后就是浏览器对这些HTML信息进行内部引擎渲染的过程了。
1275 0
ASP.NET Web API 记录请求响应数据到日志的一个方法
原文:ASP.NET Web API 记录请求响应数据到日志的一个方法 原文:http://blog.bossma.cn/dotnet/asp-net-web-api-log-request-response/ ASP.NET Web API 记录请求响应数据到日志的一个方法 REST风格的服务架构已经成为越来越多人的选择,之前我用过WCF来实现REST服务,WCF是一个很强大的框架,干这点小事有点太沉重的感觉。
1328 0
ASP.NET WebApi服务接口如何防止重复请求实现HTTP幂等性(八)
一、背景描述与课程介绍 明人不说暗话,跟着阿笨一起玩WebApi。在我们平时开发项目中可能会出现下面这些情况; 1)、由于用户误操作,多次点击网页表单提交按钮。由于网速等原因造成页面卡顿,用户重复刷新提交页面。
2873 0
解决ASP.NET中Redis 每小时6000次访问请求的问题
原文:解决ASP.NET中Redis 每小时6000次访问请求的问题 虽然ServiceStack v4是商业支持的产品,但我们也允许免费使用小型项目和评估目的。上面的NuGet包中包含可以使用许可证密钥解锁的配额: 10 ServiceStack中的操作(即请求DTO) OrmLi...
2004 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载