一、概要
當我們創建一個一般處理程序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”等這樣的字符轉換成我們原本要表示的字符。