1) 針對每一次請求,ASP.NET將建立一個處理此次請求所使用的HttpContext對象實例,這個對象實例將用來在ASP.NET服務器的處理過程當中傳遞所須要的參數,在請求到達ASP.NET服務器以後,這個對象將被建立出來,再一次請求處理以後,這個對象將被丟棄掉,因爲在大多數的處理環節都須要用到這個對象,所以,HttpContext類中還提供了一個名爲Current的靜態屬性,以便於在處理過程當中,不須要經過方法的參數而直接取得當前的上下文對象,固然,在沒有請求的狀況下,經過這個屬性得到的結果將是null。html
2) HttpContext中的常見屬性:http://msdn.microsoft.com/zh-cn/library/system.web.httpcontext(v=vs.110).aspx程序員
1) 當HttpContext對象建立以後,HttpRuntime將隨後建立一個用於處理請求的對象,這個對象的類型就是HttpApplication。web
2) 處理管道:所謂的處理管道,就是處理複雜問題的時候,將處理的過程分解爲多個處理步驟,咱們將這種通過多個步驟的處理方式稱爲處理管道。對於管道來講,它每每須要暴漏出大量的時間,經過這些事件,提供程序員的擴展機制。服務器
3) 對於有不少事件的類來講,大量定義事件意味着建立對象的時候須要付出建立時間的成本,由於在.NET中,所謂的事件就是一個受限制的委託成員,定義多個事件,覺得找在建立對象的時候須要更多的存儲空間,對於這樣的問題:在System.ComponentModel.Component類中,提供了處理多個事件的基礎:Events屬性,它的類型爲:System.ComponentModel.EventHandlerList,這是一個線性的字典,當須要事件的時候,就經過Key將事件保存到集合中,若是沒有對應的事件,就不會建立事件的成本了這樣,經過EventHandlerList能夠在一個集合中管理多個事件對象,節省了事件對象佔用的空間,他的主要屬性:http://msdn.microsoft.com/zh-cn/library/system.componentmodel.eventhandlerlist.aspx。學習
4)下面代碼演示瞭如何在類中定義多個事件,並建立處理管道,代碼以下:this
1 public class ProcessPipleline : Component 2 { 3 private static readonly object StartEvent = new object(); 4 private static readonly object PreProcessEvent = new object(); 5 private static readonly object PostProcessEvent = new object(); 6 private static readonly object EndEvent = new object(); 8 public event EventHandler StartProcess 9 { 10 add { this.Events.AddHandler(StartEvent, value); } 11 remove { this.Events.RemoveHandler(StartEvent, value); } 12 } 14 public event EventHandler PreProcess 15 { 16 add { this.Events.AddHandler(PreProcessEvent, value); } 17 remove { this.Events.RemoveHandler(PreProcessEvent, value); } 18 } 20 public event EventHandler PostProcess 21 { 22 add { this.Events.AddHandler(PostProcessEvent, value); } 23 remove { this.Events.RemoveHandler(PostProcessEvent, value); } 24 } 26 public event EventHandler EndProcess 27 { 28 add { this.Events.AddHandler(EndEvent, value); } 29 remove { this.Events.RemoveHandler(EndEvent, value); } 30 } 32 protected void OnStartProcess(EventArgs e) 33 { 34 if (this.Events[StartEvent] != null) 35 { 36 (this.Events[StartEvent] as EventHandler)(this, e); 37 } 38 } 40 protected void OnPreProcess(EventArgs e) 41 { 42 if (this.Events[PreProcessEvent] != null) 43 { 44 (this.Events[PreProcessEvent] as EventHandler)(this, e); 45 } 46 } 48 protected void OnPostProcess(EventArgs e) 49 { 50 if (this.Events[PostProcessEvent] != null) 51 { 52 (this.Events[PostProcessEvent] as EventHandler)(this, e); 53 } 54 } 56 protected void OnEndProcess(EventArgs e) 57 { 58 if (this.Events[EndEvent] != null) 59 { 60 (this.Events[EndEvent] as EventHandler)(this, e); 61 } 62 } 64 public void Process() 65 { 66 Console.WriteLine("開始處理"); 67 this.OnStartProcess(EventArgs.Empty); 68 Console.WriteLine("準備處理"); 69 this.OnPreProcess(EventArgs.Empty); 70 Console.WriteLine("正在處理中"); 71 Console.WriteLine("處理完成"); 72 this.OnPostProcess(EventArgs.Empty); 73 Console.WriteLine("結束處理"); 74 this.OnEndProcess(EventArgs.Empty); 75 } 76 } 77 ------------------------------- 78 internal class Program 79 { 80 private static void Main(string[] args) 81 { 82 ProcessPipleline process = new ProcessPipleline(); 83 process.StartProcess += new EventHandler(process_StartProcess); 84 process.PreProcess += new EventHandler(process_PreProcess); 85 process.PostProcess += new EventHandler(process_PostProcess); 86 process.EndProcess += new EventHandler(process_EndProcess); 87 Console.ReadLine(); 88 } 90 private static void process_StartProcess(object sender, EventArgs e) 91 { 92 Console.WriteLine("開始處理的事件處理....."); 93 } 95 private static void process_PreProcess(object sender, EventArgs e) 96 { 97 Console.WriteLine("處理前的事件處理...."); 98 } 100 private static void process_PostProcess(object sender, EventArgs e) 101 { 102 Console.WriteLine("處理後的事件處理......"); 103 } 105 private static void process_EndProcess(object sender, EventArgs e) 106 { 107 Console.WriteLine("處理完成的事件處理....."); 108 } 109 }
1) HttpApplication對象是ASP.NET中處理請求的重要對象,HttpApplication對象提供了19個標準事件,參考資料:http://www.cnblogs.com/OceanEyes/archive/2012/08/23/2651790.htmlspa
2)19個事件處理過程的簡單介紹以下:code
1)在ASP.NET中,ASP.NET服務器對於每一次請求的處理都是相同的,都要通過HTTPApplication的處理管道,管道內部的處理過程是固定的,在服務器處理請求的各個階段,伴隨着處理的進行,以此觸發對應的時間。component
2)關於19個管道事件的資料去網上查找學習。htm
3) HttpContext狀態管理
a.咱們知道,HttpContext經過屬性User和Handler傳遞了當前請求的用戶和處理請求所使用的處理程序信息,若是咱們還須要從HttpApplication前面的事件向後面的事件處理程序傳遞一些參數,那麼咱們能夠經過HttpContext的Items屬性來完成。
b.HttpContext類中定義了一個Items屬性,這是一個字典,其定義以下:
public IDictionary Items{get;}
c.因爲HttpContext對象貫穿整個HttpApplication的處理過程,因此,能夠藉助於這個屬性,從處理過程的前面的步驟中,將數據傳遞給後面的處理步驟,而不須要經過方法的參數或者對象的成員,這種傳遞參數的方式稱爲基於HttpContext的狀態管理。