關於上下文(Context)/1(轉MS)

來源:互聯網
上載者:User
關於上下文
Susan Warren
Microsoft Corporation
2002年1月14日

編寫 Web 應用程式時最常見的問題之一,是要讓代碼知道它的執行內容。讓我們通過一個簡單的例子(即個人化頁面)來說明這個問題:
     請登入。

     歡迎 Susan!
雖然看起來很簡單,但即使是這一小段 Web UI,仍然需要好幾段資訊,而且每次請求該頁時這些資訊都會發生變化。我們需要知道以下內容:
  1. 使用者登入了嗎?
  2. 使用者的顯示名是什嗎?

更通常的問題是,每次請求該頁時,唯一的上下文是什嗎?以及如何編寫代碼以便能考慮到此資訊?
事實上,由於 HTTP 的無狀態特性,Web 應用程式可能需要跟蹤許多不同的上下文片段。當使用者與 Web 應用程式互動時,瀏覽器將一系列獨立的 HTTP 要求發送到 Web 服務器。應用程式自身必須將這些請求組織成令使用者感到愉悅的體驗;同時,知道請求的上下文也十分關鍵。
ASP 引入了幾個內部對象,如 RequestApplication,以便協助跟蹤 HTTP 要求的上下文。ASP.NET 完成下一步驟,並將這些對象以及其他幾個與上下文有關的對象捆綁在一起,形成一個極為方便的內部對象 Context
Context 是 System.Web.HttpContext(英文)類型的對象。它作為 ASP.NET Page 類的屬性公開。也可以通過使用者控制項和業務對象(下文中詳細介紹)獲得該對象。以下是 HttpContext 形成的對象的部分列表:
對象說明 Application值的關鍵字/值對集合,可由應用程式的每個使用者訪問。Application 是 System.Web.HttpApplicationState 類型。 ApplicationInstance實際啟動並執行應用程式,它公開一些請求處理事件。這些事件在 Global.asax、HttpHandler 或 HttpModule 中處理。 CacheASP.NET Cache 對象,它提供對緩衝的編程訪問。Rob Howard 的 ASP.NET Caching 專欄(英文)對緩衝作了詳盡介紹。 Error處理頁時遇到的第一個錯誤(如果有)。有關詳細資料,請參閱 Rob 撰寫的 Exception to the Rule, Part 1(英文)。 Items關鍵字/值對集合,可以用來在參與處理同一請求的所有組件之間傳遞資訊。Items 是 System.Collections.IDictionary 類型。 Request有關 HTTP 要求的資訊,包括瀏覽器資訊、Cookies 以及在表單或查詢字串中傳遞的值。Request 是 System.Web.HttpRequest 類型。 Response用於建立 HTTP 響應的設定和內容。Response 是 System.Web.HttpResponse 類型。 Server伺服器是一個公用程式類,帶有一些有用的協助器方法,包括 Server.Execute()Server.MapPath()Server.HtmlEncode()。Server 是 System.Web.HttpServerUtility 類型的對象。 Session值的關鍵字/值對集合,可由應用程式的單個使用者訪問。Session 是 System.Web.HttpSessionState 類型。 TraceASP.NET 的 Trace 對象,提供對跟蹤功能的訪問。有關詳細資料,請參閱 Rob 撰寫的文章 Tracing(英文)。 User目前使用者(如果已經過身分識別驗證)的安全上下文。Context.User.Identity 是使用者的名稱。User 是 System.Security.Principle.IPrincipal 類型的對象。
如果您是一位 ASP 開發人員,那麼對上面講述的部分對象應不會感到陌生。雖然有一些改進,但大體而言,它們在 ASP.NET 中的作用與在 ASP 中是完全一樣的。 Context 基礎知識
Context 中的部分對象也已升級為 Page 中的頂級對象。例如, Page.Context.ResponsePage.Response 指的是同一個對象,因此,以下代碼是等價的:

[Visual Basic® Web Form]

   Response.Write ("您好")   Context.Response.Write ("你好")

[C# Web Form]

   Response.Write ("您好");   Context.Response.Write ("你好");

還可以從業務對象使用 Context 對象。 HttpContext.Current 是靜態屬性,可以很方便地返回當前請求的上下文。這在各種方法中都十分有用,下面僅列舉一個從業務類的緩衝中檢索項目的簡單樣本:

[Visual Basic]

      ' 擷取請求上下文      Dim _context As HttpContext = HttpContext.Current   ' 擷取緩衝中的資料集   Dim _data As DataSet = _context.Cache("MyDataSet")

[C#]

      // 擷取請求上下文      HttpContext _context = HttpContext.Current;   // 擷取緩衝中的資料集   DataSet _data = _context.Cache("MyDataSet");
操作中的 Context
Context 對象為一些常見的 ASP.NET“如何…?”問題提供了答案。也許,說明此寶貴對象的價值的最好方法,就是在操作中將它展示出來。下面是一些我所知道的最巧妙的 Context 技巧。

我如何從自己的業務類中產生 ASP.NET 跟蹤語句?


回答:很簡單!使用 HttpContext.Current 擷取 Context 對象,然後調用 Context.Trace.Write()

[Visual Basic]

Imports SystemImports System.WebNamespace Context   ' 示範從業務類中產生一個 ASP.NET    ' 跟蹤語句。   Public Class TraceEmit            Public Sub SomeMethod()                  ' 擷取請求上下文         Dim _context As HttpContext = HttpContext.Current                  ' 使用上下文編寫跟蹤語句         _context.Trace.Write("在 TraceEmit.SomeMethod 中")      End Sub   End ClassEnd Namespace   

[C#]

using System;using System.Web;namespace Context{   // 示範從業務類中產生一個 ASP.NET    // 跟蹤語句。   public class TraceEmit   {        public void SomeMethod() {                    // 擷取請求上下文            HttpContext _context = HttpContext.Current;            // 使用上下文編寫跟蹤語句            _context.Trace.Write("在 TraceEmit.SomeMethod 中");        }    }}

如何才能從業務類中訪問工作階段狀態值?


回答:很簡單!使用 HttpContext.Current 擷取 Context 對象,然後訪問 Context.Session

[Visual Basic]

Imports SystemImports System.WebNamespace Context   ' 示範從業務類中訪問 ASP.NET 內部   ' 會話。   Public Class UseSession         Public Sub SomeMethod()                  ' 擷取請求上下文         Dim _context As HttpContext = HttpContext.Current                  ' 訪問內部會話         Dim _value As Object = _context.Session("TheValue")      End Sub   End ClassEnd Namespace

[C#]

using System;using System.Web;namespace Context{   // 示範從業務類中訪問 ASP.NET 內部    // 會話   public class UseSession   {        public void SomeMethod() {                    // 擷取請求上下文            HttpContext _context = HttpContext.Current;            // 訪問內部會話            object _value = _context.Session["TheValue"];        }    }}

如何才能在應用程式的每頁中添加標準頁首和頁尾?


回答:處理應用程式的 BeginRequestEndRequest 事件,並使用 Context.Response.Write 產生頁首和頁尾的 HTML。
從技術上講,可以在 HttpModule 中或通過使用 Global.asax 處理 BeginRequest 這樣的應用程式。HttpModules 的編寫比較困難,而且正如本例所示,簡單應用程式使用的功能通常不使用它。因此,我們使用應用程式範圍的 Global.asax 檔案。
與 ASP 頁一樣,一些固有的 ASP.NET 上下文已提升為 HttpApplication 類的屬性,其中的類表示 Global.asax 繼承類。我們不需要使用 HttpContext.Current 擷取對 Context 對象的引用;它在 Global.asax. 中已可用。
本例中,我將 <html> 和 <body> 標記以及一條水平線放入頁首部分,而將另一條水平線及相應的結束標記放入頁尾部分。頁尾還包含著作權訊息。運行結果應如下圖所示:

圖 1:瀏覽器中呈現的標準頁首和頁尾樣本
這是一個簡單的樣本,但您可以很容易地將它擴充,使其包含標準的頁首與導航,或者僅輸出相應的 <!-- #include ---> 語句。請注意,如果希望頁首或頁尾包含互動內容,應考慮使用 ASP.NET 使用者控制項。

[SomePage.aspx 原始碼 - 內容樣本]

<FONT face="Arial" color="#cc66cc" size="5">常規頁面內容</FONT>

[Visual Basic Global.asax]

<%@ Application Language="VB" %><script runat="server">      Sub Application_BeginRequest(sender As Object, e As EventArgs)         ' 產生頁首         Context.Response.Write("<html>" + ControlChars.Lf + _"<body bgcolor=#efefef>" + ControlChars.Lf + "<hr>" + _ ControlChars.Lf)      End Sub                   Sub Application_EndRequest(sender As Object, e As EventArgs)         ' 產生頁尾         Context.Response.Write("<hr>" + ControlChars.Lf + _      "2002 Microsoft Corporation 著作權" + _      ControlChars.Lf + "</body>" + ControlChars.Lf + "</html>")      End Sub </script>

[C# Global.asax]

<%@ Application Language="C#" %><script runat="server">        void Application_BeginRequest(Object sender, EventArgs e) {            // 產生頁首            Context.Response.Write("<html>\n<body bgcolor=#efefef>\n<hr>\n");        }        void Application_EndRequest(Object sender, EventArgs e) {            // 產生頁尾            Context.Response.Write("<hr>\2002 Microsoft Corporation 著作權\n");            Context.Response.Write("</body>\n</html>");        }</script>

如何在使用者經過身分識別驗證後顯示歡迎資訊?


回答:測試 User 內容物件以查看使用者是否經過身分識別驗證。如果是,還要從 User 對象擷取使用者名稱。當然,這是本文開頭的樣本。

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。