ASP.NET本質論第二章應用程序對象學習筆記1

1.請求的處理參數—上下文對象HttpContext

  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程序員

2.應用程序對象 HttpApplication

  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 }

3.HttpApplication的處理管道

  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的狀態管理。

相關文章
相關標籤/搜索