您的位置:首页 > 编程语言 > ASP

[译] 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。
大多数的这些成员都是很方便的属性可以映射到 HttpContext 类中的属性,但是有三个值得注意,接下来详细说明。

处理属性异常

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 选译]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: