国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

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

2024-07-21 02:22:03
字體:
來源:轉載
供稿:網友


關于上下文
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 窗體]

   response.write ("您好")   context.response.write ("你好")

[c# web 窗體]

   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 對象獲取用戶名。當然,這是本文開頭的示例。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 东乡县| 青阳县| 墨竹工卡县| 页游| 北海市| 高要市| 腾冲县| 怀远县| 灵丘县| 揭西县| 常州市| 进贤县| 益阳市| 城步| 余干县| 什邡市| 宾阳县| 临泽县| 边坝县| 青海省| 内丘县| 丰都县| 洪雅县| 高安市| 大厂| 谷城县| 陆河县| 鹿邑县| 中宁县| 华宁县| 延庆县| 永吉县| 师宗县| 江孜县| 涞水县| 康马县| 邹平县| 临颍县| 延吉市| 昌都县| 兰溪市|