[译] ASP.NET 生命周期 – ASP.NET 上下文对象(六)
2016-02-18 16:23
573 查看
使用 HttpApplication 对象
ASP.NET 框架中的许多类都提供了许多很方便的属性可以直接映射到 HttpContext 类中定义的属性。这种交叠有一个很好的例子就是 HttpApplication,它就是全局应用类的基类,在下表中,你可以看到 HttpApplication 类中定义的属性和方法。许多和 HttpContext 中定义的很相似。表 1 – HttpApplication 类中定义的成员
名称 | 描述 |
Application | 对应到 HttpContext.Application 属性,通过它可以获取应用层面的状态数据。 |
CompleteRequest() | 终止当前请求的生命周期,直接跳转到 LogRequest 事件。 |
Context | 返回当前请求的 HttpContext 对象。 |
Init() | 每个注册模块上的 Init() 方法调用之后调用。 |
Modules | 返回一个 HttpModuleCollection 对象,当中详细描述了当前应用中的模块。 |
RegisterModule(type) | 注册新模块的静态方法。 |
Request | 返回 HttpContext.Request 值, 但是如果值为 null 的时候会抛出一个 HttpException。 |
Response | 返回 HttpContext.Response 值,但是如果值为 null 的时候会抛出一个 HttpException。 |
Server | 映射到 HttpContext.Server。 |
Session | 返回 HttpContext.Session 值,但是如果值为 null 的时候会抛出一个 HttpException。 |
处理属性异常
Request, Response, Session 和 User 属性返回的是 HttpContext 类中相对应的属性的值,但是,这些属性如果从 HttpContext 上对应的属性中获取的值是 null 就会抛出一个 HttpException。发生这样的事是因为 HttpApplication 类会为两种不同的生命周期接收通知:应用生命周期和请求生命周期。描述单个请求的对象是不可以在全局应用类中用来处理应用相关的事件,所以如果我们在处理应用层级的通知的时候使用了与请求相关联的属性就会抛出 HttpException 异常。
抛出这样一个异常的策略是非常粗糙的,因为这使得处理未知来源的 HttpApplication 对象非常困难,我们可以看一下下面的代码:
using SimpleApp.Models; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace SimpleApp.Controllers { public class HomeController : Controller { public ActionResult Index() { return View(GetTimeStamps()); } [HttpPost] public ActionResult Index(Color color) { Color? oldColor = Session["color"] as Color?; if (oldColor != null) { Votes.ChangeVote(color, (Color)oldColor); } else { Votes.RecordVote(color); } ViewBag.SelectedColor = Session["color"] = color; return View(GetTimeStamps()); } private List<string> GetTimeStamps() { return new List<string> { String.Format("App timestamp: {0}", HttpContext.Application["app_timestamp"]), String.Format("Request timestamp: {0}", Session["request_timestamp"])}; } } }
View Code
Controller 类是 MVC 框架的基础,当中提供了一个方便的 Session 属性与 HttpContext.Session 相关联(但是我需要使用 HttpContext.Application,因为它并没有相关联的简便的属性)。
你可以在应用启动的时候看到时间戳。因为两个值在起初的时候很可能是相同的,但是如果你重新刷新浏览器窗口的话,你会发现应用时间戳一直不变,而请求时间戳会在每次更新的时候发生改变。
图 1 - 展示应用和请求时间戳
[根据 Adam Freeman – Pro ASP.NET MVC 5 Platform 选译]
相关文章推荐
- CKEditor与CKFinder的配置(ASP.NET环境)
- Aspectj的一些知识
- [Asp.net mvc] 在Asp.net mvc 中使用MiniProfiler
- asp.net 状态管理方案总结
- 在asp中应用vb语言调用Graphics 类
- ASP.NET MVC3中Controller与View之间的数据传递总结
- 表单验证ASP.NET RequiredFieldValidator 控件使用方法及使用实例
- ASP.NET 路由
- .NET手记-ASP.NET MVC快速分页的实现
- 解读ASP.NET 5 & MVC6系列(2):初识项目
- ASP.NET 执行bat文件。
- 解读ASP.NET 5 & MVC6系列(1):ASP.NET 5简介
- ASP.NET Core 1.0
- Aspose.Words 替换word值和保存打印
- asp.net后台打印和导出WORD关闭页面JS真对 windows.open()方法
- ASP.NET中实现导出ppt文件数据的实例分享
- 介绍一个.NET枚举共用类
- Asp.net母版页引用JS/CSS 路径问题
- ASP.Net MVC利用NPOI导入导出Excel - RuleLu
- 探索Asp.net mvc 的文件上传(由浅入深)