慢說HttpContext


一、概要

當我們創建一個一般處理程序Handler.ashx時,我們可以在文件中看到這一句
public void ProcessRequest (HttpContext context)
HttpContext 類是.NET Framework 類庫中很重要的一個類。它封裝有關個別 HTTP 請求的所有 HTTP 特定的信息。
HttpContext的命名空間:System.Web
HttpContext的程序集:System.Web(在 system.web.dll 中)
為繼承 IHttpModule 和 IHttpHandler 接口的類提供了對當前 HTTP 請求的 HttpContext 對象的引用。該對象提供對請求的內部 Request、Response 和 Server 屬性的訪問。
例如:我們可以這樣用Response
context.Response.ContentType = "text/plain";
context.Response.Write("Hello World");
1.生存周期:從客戶端用戶點擊並產生了一個向服務器發送請求開始---服務器處理完請求並生成返回到客戶端為止。注:針對每個不同用戶的請求,服務器都會創建一個新的HttpContext實例直到請求結束,服務器銷毀這個實例。

2.為什么會有HttpContext類呢:在ASP年代大家都是通過在.asp頁面的代碼中使用Request、Respose、Server等等這些Http特定信息的。但在ASP.NET時代,這中方式已經無法滿足應用,(比如我們要在IHttpModule中處理Request時,我們使用什么方法來獲取呢?於是就產生了HttpContext類,它對Request、Respose、Server等等都進行了封裝,並保證在整個請求周期內都可以隨時隨地的調用)。

3.特殊性:當然HttpContext不僅僅只有這點功能.ASP.NET中它還提供了很多特殊的功能。例如Cache、還有HttpContext.Item,通過它你可以在HttpContext的生存周期內提前存儲一些臨時的數據,方便隨時使用。

二、Items

ASP.NET提供了很多變量來管理狀態:比如application state,session state,view state等。這里介紹一種通過HttpContext類的Items(屬性) 集合來保存Http狀態。

HttpContext對象只針對一個單一的http請求(注意http的無狀態)。這個類的屬性還有Request對象、Response對象、Session對象等。你可以通過Context.Items["MyObject"] = new object();或 object o = Context.Items["MyObject"];來set或get 它。Items包含了key-value形式的哈希表對象。

主要用法:

1、在兩個表單之間傳遞數據,看下面的代碼:

對於WebForm1:

private void Page_Load(object sender, System.EventArgs e)

{
   ArrayList list = new ArrayList(4);
   list.Add("This list ");
   list.Add("is for ");
   list.Add("WebForm2 ");
   list.Add("to see. ");
   Context.Items["WebForm1List"] = list;
   Server.Transfer("WebForm2.aspx");
}

//特別說明Server。Transfer是在服務器直接操作的的和調用的地方屬於同一次http請求,此處如果使用Response.Redirect則再WebForm2中再次訪問Context.Items["WebForm1List"]時,Context.Items["WebForm1List"]null,因為Response.Redirect是重新發起了一次Http請求

對於WebForm2:

private void Page_Load(object sender, System.EventArgs e)
{
   ArrayList list = Context.Items["WebForm1List"] as ArrayList;
   if(list != null)
   {
    foreach(string s in list)
    {
        Response.Write(s);
    }
   } 
}

在WebForm1的頁面加載過程中,通過Server.Transfer方法,將WebForm1的狀態傳遞到了WebForm2,WebForm2可以得到它,並作一些相應的處理。用法1也可以用Session來做。

2、截獲Http請求並作特殊處理

主要是用在Application_BeginRequest方法里。Application_BeginRequest方法在global.asax.cs里定義。你可以在Http請求剛剛開始的時候,截獲他,做一些特殊的處理。這里你不能用Session來做,因為此時Session對象還沒有被建立。
利用Context.Item集合,你可以在Http請求的整個生命期,通過HttpModules, HttpHandlers, Webforms, and Application 事件。

三、Request

ASP.NET RequestRequest封裝了客戶端請求信息,是從客戶端得到數據,常用的三種取得數據的方法是:Request.Form、Request.QueryString,Request。其第三種是前兩種的一個縮寫,可以取代前兩種情況。而前兩種主要對應的Form提交時的兩種不同的提交方法:分別是Post方法和Get方法。

ASP.NET Request對象的屬性和方法比較多,常用的幾個為:UserAgent 傳回客戶端瀏覽器的版本信息,UserHostAddress 傳回遠方客戶端機器的主機IP 地址,UserHostName 傳回遠方客戶端機器的DNS 名稱,PhysicalApplicationPath 傳回目前請求網頁在Server 端的真實路徑。

ASP.NET Request對象使用之從瀏覽器獲取數據

利用ASP.NET Request對象方法,可以讀取其他頁面提交過來的數據。提交的數據有兩種形式:一種是通過Form表單提交過來,另一種是通過超級鏈接后面的參數提交過來,兩種方式都可以利用Request對象讀取。

﹤%@ Page Language="C#"%﹥   
﹤%    
    string strUserName = Request["Name"];   
    string strUserLove = Request["Love"];   
%﹥    
姓名:﹤%=strUserName%﹥   
愛好:﹤%=strUserLove%﹥   
﹤form action="" method="post"﹥   
﹤P﹥姓名:﹤input type="TEXT" size="20" name="Name"﹥﹤/P﹥   
﹤P﹥興趣:﹤input type="TEXT" size="20" name="Love"﹥﹤/P﹥  
﹤P﹥﹤input type="submit" value="提 交"﹥﹤/P﹥   
﹤/form﹥

ASP.NET Request對象使用之得到客戶端的信息
利用Request對象內置的屬性,可以得到一些客戶端的信息,比如客戶端瀏覽器版本和客戶端地址等等
﹤%@ Page Language="C#"%﹥ 
客戶端瀏覽器:﹤%=Request.UserAgent %﹥ 
客戶端IP地址:﹤%=Request.UserHostAddress %﹥  
當前文件服務端物理路徑:﹤%=Request.PhysicalApplicationPath %﹥
Request常見的屬性有:

屬性名

值類型

說明

ApplicationPath

String

獲取請求的資源在網站上的根路徑

ContentEncoding

Encoding

設置請求對象的編碼

Cookies

HttpCookieCollection

客戶端發送到服務器的Cookie集合

QueryString

NameValueCollection

當前請求的查詢字符串集合

UrlReferrer

Uri

獲取用戶由哪個url跳轉到當前頁面

四、Response

Response代表了服務器響應對象。每次客戶端發出一個請求的時候,服務器就會用一個響應對象來處理這個請求,處理完這個請求之后,服務器就會銷毀這個相應對象,以便繼續接受其它客服端請求。

Response常用屬性如下:

屬性名

值類型

說明

Charset

 string

表示輸出流的所使用的字符集

ContentEncoding

 Encoding

 設置輸出流的編碼

ContentLength

 Int

 輸出流的字節大小

ContentType

string

 輸出流的HTTP MIME類型

Cookies

HttpCookieCollection

 服務器發送到客戶端的Cookie集合

Output

TextWriter

 服務器響應對象的字符輸出流

RedirectLocation

 string

 將當前請求重定向s

Response常用方法如下:

方法名

返回值類型

說明

AppendCookie

void

向響應對象的Cookie集合中增加一個Cookie

Clear

void

清空緩沖區中的所有內容輸出

Close

void

關閉當前服務器到客戶端的連接

End

void

終止響應,並且將緩沖區中的輸出發送到客戶端

Redirect

void

重定向當前請求

關於Response.Redirect和Server.Transfer:

response.redirect其實上是當服務器碰到這條語句時發送一條指令(包含新的地址)給瀏覽器,然后讓瀏覽器去發送http請求,請求response.redirect后面的那個新的http地址,流程如下: 

瀏覽器文件請求->服務器執行->遇到response.redirect語句->服務器發送response.redirect后面的地址給客戶機端的瀏覽器->瀏覽器請求執行新的地址(服務器返回的Response.Redirect后面的地址)這就是一個小小的Response.Redirect的全部過程, Server.Transfer語句當接受地址后是直接轉向后面的地址,流程如下: 

瀏覽器文件請求->服務器執行->遇到Server.Transfer語句->服務器轉向新的文件。 

Server.Transfer方法與Redirect方法相比另一個顯著的優勢是在頁面轉換時,Request集合里的內容不會丟失(同一個http請求),這給我們編程帶來很大的方便. 

一般的情況下盡可能用Server.Transfer方法(前提是服務器是IIS),Server.Transfer方法更快速,而且因為只在服務器上執行,所以可以和任何瀏覽器兼容。

五、Server

Server對象是用於獲取服務器的相關信息的對象。它常用方法如下:

屬性名

返回值類型

說明

Execute

void

執行指定的資源,並且在執行完之后再執行本頁的代碼

HtmlDecode

string

消除對特殊字符串編碼的影響

HtmlEncode

string

對特殊字符串進行編碼

MapPath

string

獲取指定相對路徑在服務器上的無力路徑

Transfer

void

停止執行當前程序,執行指定的資源

UrlDecode

string

對路徑字符串進行解碼

UrlEncode

string

對路徑字符串進行編碼

上面的方法光從概念上來說,似乎還是讓人不能分清他們到底有什么作用,特別Excure/ Transfer、HtmlEncode(HtmlDecode)/ UrlEncode(UrlDecode)這兩組。在講述他們分別之前先講述MapPath這個方法的作用,在我們上傳文件的時候要以物理路徑保存上傳文件到服務器,而我們使用得最多的是相對URL地址,這個方法就起到了將相對URL地址轉換成服務器物理路徑的作用。為了說明Excure/ Transfer及HtmlEncode(HtmlDecode)/ UrlEncode(UrlDecode)的區別,我們還是用實例代碼來展示:

<ul> 
<li>Server.MapPath(".")=<%=Server.MapPath(".")%></li> 
<li><%=Server.HtmlEncode("<h1>Server---HtmlEncode</h1>")%></li> 
<li><%=Server.HtmlDecode("<h1>Server---HtmlDecode</h1>")%></li> 
<li><h1>Server---Nothing</h1></li> 
<li><%=Server.UrlEncode("<a href=\"http://www.cnblogs.com/qiufuwu618\">深秋葉落</a>")%></li> 
<li><%=Server.UrlDecode("<a href=\"http://www.cnblogs.com/qiufuwu618\">深秋葉落</a>")%></li>
<li><a href="http://www.cnblogs.com/qiufuwu618">深秋葉落</a></li> 
</ul> 

從Server.MathPath(“.”)證明確實能獲取到相對路徑的在服務器上的實際物理地址。

在上面的例子中我們想在網頁中輸出HTML代碼,如果直接輸出往往得不到想要的效果,這時可以借助HtmlEncode方法對要輸出的HTML代碼進行編碼,這樣輸出到瀏覽器上的時候就能看到HTML代碼(包含html標志),而不是HTML形式的效果。HtmlDecode方法則是用來消除這種影響。

如果我們直接輸出“<a href="http://www.cnblogs.com/qiufuwu618">深秋葉落</a>”這個字符串的話,在網頁上會顯示一個超級鏈接,但是有時候我們希望把這個超級鏈接作為QueryString的一個參數,由於url地址的特殊性,比如“:”、“/”等字符串在URL地址中有特殊的含義,要想輸出這些字符,直接輸出是不行的,需要進行某種轉換,並且將來還能轉換回來。經過UrlEncode方法轉換之后,“:”、“/”分別轉換成了“%3a”和“%2f”這樣的字符,並且漢字也進行了轉換。UrlDecode方法則是將“%3a”和“%2f”等這樣的字符轉換成我們原本要表示的字符。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM