[译] ASP.NET 生命周期 – ASP.NET 请求生命周期(四)
不使用特殊方法来处理请求生命周期事件
HttpApplication 类是全局应用类的基类,定义了可以直接使用的一般 C# 事件。那么使用标准 C# 事件还是特殊方法那就是个人偏好的问题了,如果喜欢,也可以将这两种方式混合起来使用。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing; namespace SimpleApp
{
public class MvcApplication : System.Web.HttpApplication
{
public MvcApplication()
{
BeginRequest += (src, args) => RecordEvent("BeginRequest");
AuthenticateRequest += (src, args) => RecordEvent("AuthenticateRequest");
PostAuthenticateRequest += (src, args) => RecordEvent("PostAuthenticateRequest");
} protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
} private void RecordEvent(string name)
{
List<string> eventList = Application["events"] as List<string>;
if (eventList == null)
{
Application["events"] = eventList = new List<string>();
}
eventList.Add(name);
}
}
}
我们已经在 MvcApplication 类中添加了一个构造器,并为其中三个请求生命周期事件建立事件处理器。而这三个事件我都使用了 lambda 表达式来调用 RecordEvent 方法,存储事件的名称供 controller 来读取,与之前的例子一样。
提示:没有标准的 C# 事件来代替 Application_Start 和 Application_End 方法。我们仅能够通过特殊方法来接收这两个通知。
使用单个方法处理多个事件
如果我们想要使用一个方法来处理多个生命周期事件而不依赖 lambda 表达式,那么 System.Web.HttpContext 类中定义的两个属性可以帮助我们。HttpContext 类中提供了当前请求和应用状态的详细信息,我们会在后面详细介绍。然而目前,我们只会介绍与处理生命周期事件的两个属性。
| 名称 | 描述 |
| CurrentNotification | 这个属性会使用 System.Web.RequestNotification 枚举中的值来指示当前应用事件。 |
| IsPostNotification | 如果 CurrentNotification 属性返回的当前应用事件名称是 Post<Name> 的变体,那么这个属性就会返回 true。 |
这两个属性有一点奇怪,因为两者都需要计算出哪个事件正在被处理。CurrentNotification 属性返回一个 RequestNotification 枚举值,当中定义了 HttpApplication 事件的子集。IsPostNotification 属性值是根据当前触发的事件是否是一个像 AcquireRequestState 的事件还是与其配对的 PostAcquireRequestState 事件计算出来的。在 HttpApplication 类中,可以通过 Context 属性获取到 HttpContext 对象。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing; namespace SimpleApp
{
public class MvcApplication : System.Web.HttpApplication
{
public MvcApplication()
{
BeginRequest += RecordEvent;
AuthenticateRequest += RecordEvent;
PostAuthenticateRequest += RecordEvent;
} protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
} private void RecordEvent(object src, EventArgs args)
{
List<string> eventList = Application["events"] as List<string>;
if (eventList == null)
{
Application["events"] = eventList = new List<string>();
}
string name = Context.CurrentNotification.ToString();
if (Context.IsPostNotification)
{
name = "Post" + name;
}
eventList.Add(name);
}
}
}
我改变了 RecordEvent 方法的签名,因此采用了标准的事件处理器签名:一个对象代表的是事件的源,EventArgs 对象描述的就是事件。我没有使用这两个参数提供的值,相反,我使用了 Context.CurrentNotification 属性和 Context.IsPostNotification 属性提供的相关信息。
我不明白微软为什么以这样的一个方式来实现事件,但是如果你不想使用特殊方法或者 lambda 表达式的话,那你就必须使用这种方式。注意到,在上面的代码中,我在 Context.CurrentNotification 属性上使用了 ToString 方法,这是必须的,因为 CurrentNotification 属性返回的是一个 System.Web.RequestNotification 枚举值。详见下表:
表 1 – RequestNotification 枚举值
| 值 | 描述 |
| BeginRequest | 对应到 BeginRequest 事件 |
| AuthenticateRequest | 对应到 AuthenticateRequest 和 PostAuthenticateRequest 事件 |
| AuthorizeRequest | 对应到 AuthorizeRequest 事件 |
| ResolveRequestCache | 对应到 ResolveRequestCache 和 PostResolveRequestCache 事件 |
| MapRequestHandler | 对应到 MapRequestHandler和 PostMapRequestHandler 事件 |
| AcquireRequestState | 对应到 AcquireRequestState 和 PostRequestState 事件 |
| PreExecuteRequestHandler | 对应到 PreExecuteRequestHandler 事件 |
| ExecuteRequestHandler | 对应到 ExecuteRequestHandler 事件 |
| ReleaseRequestState | 对应到 ReleaseRequestState 和 PostReleaseRequestState 事件 |
| UpdateRequestCache | 对应到 UpdateRequestCahce 事件 |
| LogRequest | 对应到 LogRequest 事件 |
| EndRequest | 对应到 EndRequest 事件 |
| SendResponse | 指示响应正在被发送——不完全对应到 PreSendRequestHeaders 和 PreSendRequestContent 事件 |
[根据 Adam Freeman – Pro ASP.NET MVC 5 Platform 选译]
[译] ASP.NET 生命周期 – ASP.NET 请求生命周期(四)的更多相关文章
- C# MVC 5 - 生命周期(应用程序生命周期&请求生命周期)
本文是根据网上的文章总结的. 1.介绍 本文讨论ASP.Net MVC框架MVC的请求生命周期. MVC有两个生命周期,一为应用程序生命周期,二为请求生命周期. 2.应用程序生命周期 应用程序生命周期 ...
- $Django orm增删改字段、建表 ,单表增删改查,Django请求生命周期
1 orm介绍 ORM是什么 ORM 是 python编程语言后端web框架 Django的核心思想,“Object Relational Mapping”,即对象-关系映射,简称ORM. 一 ...
- django请求生命周期流程与路由层相关知识
目录 请求生命周期流程图 路由层之路由匹配 无名有名分组 反向解析 无名有名分组反向解析 路由分发 名称空间 请求生命周期流程图 django请求生命周期流程图 路由层之路由匹配 我们都知道,路由层是 ...
- [译] ASP.NET 生命周期 – ASP.NET 请求生命周期(三)
使用特殊方法处理请求生命周期事件 为了在全局应用类中处理这些事件,我们会创建一个名称以 Application_ 开头,以事件名称结尾的方法,比如 Application_BeginRequest.举 ...
- [译] ASP.NET 生命周期 – ASP.NET 请求生命周期(二)
ASP.NET 请求生命周期 全局应用类也可以用来跟踪每个独立请求的生命周期,包括请求从 ASP.NET 平台传递到 MVC 框架.ASP.NET 框架会创建一个定义在 Global.asax 文件中 ...
- [译] ASP.NET 生命周期 – ASP.NET 上下文对象(六)
使用 HttpApplication 对象 ASP.NET 框架中的许多类都提供了许多很方便的属性可以直接映射到 HttpContext 类中定义的属性.这种交叠有一个很好的例子就是 HttpAppl ...
- [译] ASP.NET 生命周期 – ASP.NET 上下文对象(五)
ASP.NET 上下文对象 ASP.NET 提供了一系列对象用来给当前请求,将要返回到客户端的响应,以及 Web 应用本身提供上下文信息.间接的,这些上下文对象也可以用来回去核心 ASP.NET 框架 ...
- [译] ASP.NET 生命周期 – ASP.NET 应用生命周期(一)
概述 ASP.NET 平台定义了两个非常重要的生命周期.第一个是 应用生命周期 (application life cycle),用来追踪应用从启动的那一刻到终止的那一刻.另一个就是 请求生命周期 ...
- 详解ASP.NET MVC的请求生命周期
本文的目的旨在详细描述asp.net mvc请求从开始到结束的每一个过程. 我希望能理解在浏览器输入url并敲击回车来请求一个asp.net mvc网站的页面之后发生的任何事情. 为什么需要关心这些? ...
随机推荐
- velocity基本用法
1.定义变量 #set($root="www");#set($name="index.vm");#set($tmp="$root/$name" ...
- [改善Java代码]用枚举实现工厂方法模式更简洁
工厂方法模式(Factory Method Patter)是"创建对象的接口",让子类决定实例化哪一个类,并使一个类的实例化延迟到其子类.工厂方法模式在我们的开发工作中,经常会用到 ...
- ExecutorService.invokeAny()和ExecutorService.invokeAll()的使用剖析
ExecutorService是JDK并发工具包提供的一个核心接口,相当于一个线程池,提供执行任务和管理生命周期的方法.ExecutorService接口中的大部分API都是比较容易上手使用的,本文主 ...
- 蓝牙 CoreBluetooth
baseK(相关基础知识)蓝牙常见名称和缩写 BLE:(Bluetooth low energy)蓝牙4.0设备因为低耗电,也叫BLEperipheral,central:外设和中心设备,发起链接的是 ...
- No Dialect mapping for JDBC type: -1
MySQL数据库中有张表的字段是text,查询出来后对应的java类型是String,Dialect设置为org.hibernate.dialect.MySQLDialect 运行的时候报错:No D ...
- sort排序中的坑
问题的产生原因: 在一篇阿里面试题的跟帖中,很多人应用sort()方法对数组进行排序.看似合情合理的代码,运行结果却频频出错.为什么呢?因为很多人都忽略掉了一点,那就是sort()排序默认情况下是按A ...
- redis学习-day1
1.nosql数据库的一种. 2.Redis 是一种开源的,先进的key-value存储.它通常被称为数据结构服务器.因为键可以包含字符串.哈希.链表.集合和有序集合. 特点: 3.为了保证效率,数据 ...
- 在Ubuntu下配置Apache多域名服务器
1. 目标: 在本机 实现访问不同域名 可以访问不同的目录. 即:访问a.com 进入 /var/www/a 目录下的程序,访问b.com 进入/var/www/b目录下的程序. 2.遇到的问题: / ...
- ios Swift 特性
特性提供了关于声明和类型的更多信息.在Swift中有两类特性,用于修饰声明的以及用于修饰类型的.例如,required特性,当应用于一个类的指定或便利初始化器声明时,表明它的每个子类都必须实现那个初始 ...
- [转]WCF 4 安全性和 WIF 简介
转自:http://www.cnblogs.com/WizardWu/archive/2010/10/04/1841793.html 本帖简介 .NET 新一代的 Windows Identity ...