ASP.NET本质论第二章应用程序对象学习笔记1
1.请求的处理参数—上下文对象HttpContext
1) 针对每一次请求,ASP.NET将创建一个处理这次请求所使用的HttpContext对象实例,这个对象实例将用来在ASP.NET服务器的处理过程中传递所需要的参数,在请求到达ASP.NET服务器之后,这个对象将被创建出来,再一次请求处理之后,这个对象将被丢弃掉,由于在大多数的处理环节都需要用到这个对象,因此,HttpContext类中还提供了一个名为Current的静态属性,以便于在处理过程中,不需要通过方法的参数而直接取得当前的上下文对象,当然,在没有请求的情况下,通过这个属性获得的结果将是null。
2) HttpContext中的常见属性:http://msdn.microsoft.com/zh-cn/library/system.web.httpcontext(v=vs.110).aspx
2.应用程序对象 HttpApplication
1) 当HttpContext对象创建之后,HttpRuntime将随后创建一个用于处理请求的对象,这个对象的类型就是HttpApplication。
2) 处理管道:所谓的处理管道,就是处理复杂问题的时候,将处理的过程分解为多个处理步骤,我们将这种经过多个步骤的处理方式称为处理管道。对于管道来说,它往往需要暴漏出大量的时间,通过这些事件,提供程序员的扩展机制。
3) 对于有很多事件的类来说,大量定义事件意味着创建对象的时候需要付出创建时间的成本,因为在.NET中,所谓的事件就是一个受限制的委托成员,定义多个事件,以为找在创建对象的时候需要更多的存储空间,对于这样的问题:在System.ComponentModel.Component类中,提供了处理多个事件的基础:Events属性,它的类型为:System.ComponentModel.EventHandlerList,这是一个线性的字典,当需要事件的时候,就通过Key将事件保存到集合中,如果没有对应的事件,就不会创建事件的成本了这样,通过EventHandlerList可以在一个集合中管理多个事件对象,节省了事件对象占用的空间,他的主要属性:http://msdn.microsoft.com/zh-cn/library/system.componentmodel.eventhandlerlist.aspx。
4)下面代码演示了如何在类中定义多个事件,并创建处理管道,代码如下:
public class ProcessPipleline : Component
{
private static readonly object StartEvent = new object();
private static readonly object PreProcessEvent = new object();
private static readonly object PostProcessEvent = new object();
private static readonly object EndEvent = new object();
public event EventHandler StartProcess
{
add { this.Events.AddHandler(StartEvent, value); }
remove { this.Events.RemoveHandler(StartEvent, value); }
}
public event EventHandler PreProcess
{
add { this.Events.AddHandler(PreProcessEvent, value); }
remove { this.Events.RemoveHandler(PreProcessEvent, value); }
}
public event EventHandler PostProcess
{
add { this.Events.AddHandler(PostProcessEvent, value); }
remove { this.Events.RemoveHandler(PostProcessEvent, value); }
}
public event EventHandler EndProcess
{
add { this.Events.AddHandler(EndEvent, value); }
remove { this.Events.RemoveHandler(EndEvent, value); }
}
protected void OnStartProcess(EventArgs e)
{
if (this.Events[StartEvent] != null)
{
(this.Events[StartEvent] as EventHandler)(this, e);
}
}
protected void OnPreProcess(EventArgs e)
{
if (this.Events[PreProcessEvent] != null)
{
(this.Events[PreProcessEvent] as EventHandler)(this, e);
}
}
protected void OnPostProcess(EventArgs e)
{
if (this.Events[PostProcessEvent] != null)
{
(this.Events[PostProcessEvent] as EventHandler)(this, e);
}
}
protected void OnEndProcess(EventArgs e)
{
if (this.Events[EndEvent] != null)
{
(this.Events[EndEvent] as EventHandler)(this, e);
}
}
public void Process()
{
Console.WriteLine("开始处理");
this.OnStartProcess(EventArgs.Empty);
Console.WriteLine("准备处理");
this.OnPreProcess(EventArgs.Empty);
Console.WriteLine("正在处理中");
Console.WriteLine("处理完成");
this.OnPostProcess(EventArgs.Empty);
Console.WriteLine("结束处理");
this.OnEndProcess(EventArgs.Empty);
}
}
-------------------------------
internal class Program
{
private static void Main(string[] args)
{
ProcessPipleline process = new ProcessPipleline();
process.StartProcess += new EventHandler(process_StartProcess);
process.PreProcess += new EventHandler(process_PreProcess);
process.PostProcess += new EventHandler(process_PostProcess);
process.EndProcess += new EventHandler(process_EndProcess);
Console.ReadLine();
}
private static void process_StartProcess(object sender, EventArgs e)
{
Console.WriteLine("开始处理的事件处理.....");
}
private static void process_PreProcess(object sender, EventArgs e)
{
Console.WriteLine("处理前的事件处理....");
}
private static void process_PostProcess(object sender, EventArgs e)
{
Console.WriteLine("处理后的事件处理......");
}
private static void process_EndProcess(object sender, EventArgs e)
{
Console.WriteLine("处理完成的事件处理.....");
}
}
3.HttpApplication的处理管道
1) HttpApplication对象是ASP.NET中处理请求的重要对象,HttpApplication对象提供了19个标准事件,参考资料:http://www.cnblogs.com/OceanEyes/archive/2012/08/23/2651790.html
2)19个事件处理过程的简单介绍如下:
1)在ASP.NET中,ASP.NET服务器对于每一次请求的处理都是相同的,都要经过HTTPApplication的处理管道,管道内部的处理过程是固定的,在服务器处理请求的各个阶段,伴随着处理的进行,以此触发对应的时间。
2)关于19个管道事件的资料去网上查找学习。
3) HttpContext状态管理
a.我们知道,HttpContext通过属性User和Handler传递了当前请求的用户和处理请求所使用的处理程序信息,如果我们还需要从HttpApplication前面的事件向后面的事件处理程序传递一些参数,那么我们可以通过HttpContext的Items属性来完成。
b.HttpContext类中定义了一个Items属性,这是一个字典,其定义如下:
public IDictionary Items{get;}
c.由于HttpContext对象贯穿整个HttpApplication的处理过程,所以,可以借助于这个属性,从处理过程的前面的步骤中,将数据传递给后面的处理步骤,而不需要通过方法的参数或者对象的成员,这种传递参数的方式称为基于HttpContext的状态管理。
ASP.NET本质论第二章应用程序对象学习笔记1的更多相关文章
- ASP.NET本质论第一章网站应用程序学习笔记3-对象化的Http
在.NET环境下,万物皆对象,在HttpRuntime收到请求之后,立即将通过HttpWorkerRequest传递的参数进行分析和分解,创建方便用于网站应用程序处理用的对象,其中主要涉及到两个对象类 ...
- ASP.NET本质论第一章网站应用程序学习笔记2
1.初步走进ASP.NET 上篇笔记我们讲述了服务器监听问题,这篇我们就要讲述具体的请求处理了,ASP.NET所涉及的类大多数定义在System.Web程序集中. 在.NET中,程序集管理的最小逻辑单 ...
- ASP.NET本质论第一章网站应用程序学习笔记1
1.统一资源标示符 1) 格式:协议://主机[.端口号][绝对路径[?参数]],在Http://www.kencery.com/hyl/index/login中,http表示协议的名称,www.ke ...
- <<深入Java虚拟机>>-第二章-Java内存区域-学习笔记
Java运行时内存区域 Java虚拟机在运行Java程序的时候会将它所管理的内存区域划分为多个不同的区域.每个区域都有自己的用途,创建以及销毁的时间.有的随着虚拟机的启动而存在,有的则是依赖用户线程来 ...
- 《算法》第二章部分程序 part 4
▶ 书中第二章部分程序,加上自己补充的代码,包括优先队列和索引优先队列 ● 优先队列 package package01; import java.util.Comparator; import ja ...
- 《算法》第二章部分程序 part 5
▶ 书中第二章部分程序,加上自己补充的代码,包括利用优先队列进行多路归并和堆排序 ● 利用优先队列进行多路归并 package package01; import edu.princeton.cs.a ...
- 《算法》第二章部分程序 part 3
▶ 书中第二章部分程序,加上自己补充的代码,包括各种优化的快排 package package01; import edu.princeton.cs.algs4.In; import edu.prin ...
- 《算法》第二章部分程序 part 2
▶ 书中第二章部分程序,加上自己补充的代码,包括若干种归并排序,以及利用归并排序计算数组逆序数 ● 归并排序 package package01; import java.util.Comparato ...
- 《算法》第二章部分程序 part 1
▶ 书中第二章部分程序,加上自己补充的代码,包括插入排序,选择排序,Shell 排序 ● 插入排序 package package01; import java.util.Comparator; im ...
随机推荐
- POJ 1308 Is It A Tree?
Is It A Tree? Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18778 Accepted: 6395 De ...
- 数轴上从左到右有n个点a[0],a[1]…,a[n-1],给定一根长度为L的绳子,求绳子最多能覆盖其中的几个点。要求算法复杂度为o(n)。
#include <iostream> using namespace std; int maxCover(int* a, int n, int l) { ; ; ; while(end ...
- MarkDown写blog(测试)
区块元素 段落和换行 一个 Markdown 段落是由一个或多个连续的文本行组成,它的前后要有一个以上的空行(空行的定义是显示上看起来像是空的,便会被视为空行.比方说,若某一行只包含空格和制表符,则该 ...
- 安卓开发笔记——自定义广告轮播Banner(实现无限循环)
关于广告轮播,大家肯定不会陌生,它在现手机市场各大APP出现的频率极高,它的优点在于"不占屏",可以仅用小小的固定空位来展示几个甚至几十个广告条,而且动态效果很好,具有很好的用户& ...
- [原]如何在Android用FFmpeg解码图像
前一篇[原]如何用Android NDK编译FFmpeg 我们知道了如何使用NDK来编译Android平台下使用的FFmpeg动态库.这篇文章我们就可以使用Android下的JNI来调用FFMpeg进 ...
- CSS 块状元素和内联元素
在用CSS布局页面的时候,我们会将HTML标签分成两种,块状元素和内联元素(我们平常用到的div和p就是块状元素,链接标签a就是内联元素) 块状元素一般是其他元素的容器,可容纳内联元素和其他块状元素, ...
- 菜鸟学Windows Phone 8开发(4)——设置应用程序样式
本系列文章来源MSDN的 面向完全新手的 Windows Phone 8 开发 本文地址:http://channel9.msdn.com/Series/Windows-Phone-8-Develo ...
- 菜鸟学Windows Phone 8开发(1)——创建第一个应用程序
本系列文章来源MSDN的 面向完全新手的 Windows Phone 8 开发 主要是想通过翻译本系列文章来巩固下基础知识顺带学习下英语和练习下自己的毅力(因为打算每天翻译一篇,但是发现翻译这篇花费了 ...
- codeforces C. Design Tutorial: Make It Nondeterministic
题意:每一个人 都有frist name 和 last name! 从每一个人的名字中任意选择 first name 或者 last name 作为这个人的编号!通过对编号的排序,得到每一个人 最终顺 ...
- 【原创】C#搭建足球赛事资料库与预测平台(3) 基础数据表设计
本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html 开源C#彩票数据资料库系列文章总目录:http://www.cn ...