System.Web概述:
System.Web是.NET中web應用開發的一個基礎類庫,定義瀏覽器與伺服器之間的所有操作方法,包括請求輸入資料流(HttpRequest)、輸出資料流(HttpResponse)和上下文管理類(HttpContext)等於HTTP請求相關的類。
只有添加了對System.Web命名空間的引用,開發人員才可以在程式中處理與HTTP請求相關的資訊。引用命名空間的代碼如下,其中“using”是載入命名空間的關鍵字,後面是命名空間的全稱。
using System.Web;
用戶端發送的HTTP資訊集合:HttpRequest類
HttpRequest類管理著用戶端發送的HTTP資訊集合,包括Cookies、HTTP頭資訊和主體資訊等。通過HttpRequest的Browse屬性還可以擷取用戶端瀏覽器的一些基本資料。
HttpRequest還可以登陸到網路上其他伺服器,然後結合網路操作的一些其他類,通過HTTP擷取其他網站的資訊。這一點在未來的Web服務應用中特別重要。
文法定義
HttpRequest類的定義特別簡單,具體文法定義如下:
Public sealed class HttpRequest
使用HttpRequest類的建構函式文法如下:
public HttpRequest(string filename,string url,string querystring)
參數“filename”表示請求的檔案詳細路徑
參數“url”表示當前請求的URL的名稱
參數“querystring”表示請求的變數,指所請求URL中“?”後所有的變數
在實際的應用中,通常不需要建立自己的HttpRequest執行個體,因為其方法和屬性由其他類(如Page和HttpContext)的Request屬性提供。
方法詳解
HttpRequest類主要用來擷取HTTP請求的資訊,所以要求的屬性特別多,而方法主要是進行一些必需的轉換,下面是HttpRequest類中常用的方法及其說明。
BinaryRead: 用二進位讀取當前輸入資料流
MapPath :虛擬路徑到實體路徑的映射
SaveAs :將Http請求儲存在到磁碟
ValidateInput :對訪問的資料進行驗證
典型應用:
HttpRequest類並不需要專門執行個體化,而是採用Page和HttpContext等類的Request屬性來實現其基本方法和屬性。本例就是使用Page類的Request屬性來完成HttpRequest類的執行個體。
Response.Write("參數的值為: " +Request.QueryString["name"]+"<br/>") ;擷取頁面傳遞參數並顯示Response.Write("當前URL為:" +Request.Url+"<br/>") ;//擷取當前的URLResponse.Write("用戶端IP為:" +Request.UserHostAddress+“<br/>" ); //擷取用戶端的IPResponse.Write("輸入資料流的位元組數位:" +Request.TotalBytes+ "<br/>"); //擷取輸入資料流的總位元組數Response.Write("伺服器第一個KEY:" +Request.ServerVariables.AllKeys[0]+"<br/>"); //擷取伺服器變數集合中的第一個變數Request.SaveAs(@"C:\test.txt",true); //頁面傳遞過來的請求儲存在檔案中
個人總結:HttpRequest類是一個請求類,使用者通過Http協議訪問web服務期間包含很多的http請求資訊,這個類可以所是這些資訊的封裝體,我們可以通過HttpRequest類訪問那些請求資訊,如Request.Url、Request.QueryString["name"]等。
伺服器返回的Http資訊:HttpReponse
HttpReponse類管理著伺服器對Http請求的響應,並提供一些方法和屬性操作這些返回資料。在實際應用中,一般不執行個體化HttpRepsonse類,而是通過Page、HttpContext等的Request屬性獲得其屬性和方法,這與HttpRequest類相同。
文法定義:
HttpResponse類,其文法定義如下:
public sealed class HttpReponse
使用HttpResponse類的建構函式如下:
public HttpReponse(TextWriter writer)
參數writer表示輸出內容的字元編輯器。
屬性詳解:
HttpResponse類包含很多非常重要的應用程式屬性,如當前伺服器的緩衝和緩衝的配置等。下面列出這些屬性及其說明:
Buffer :是否緩衝輸出,完成響應之後再發出
BufferOutput :是否緩衝輸出,完成頁面後再發送
Cache:網頁的緩衝策略
Charset :設定輸出資料流的http字元集
ContentEncoding:流的內容編碼格式
ContentType:控制流程的HTTP MIME類型
Cookies :擷取響應的Cookie集合
Expires :擷取緩衝到期的時間
方法詳解:
HttpRepsonse類主要用來封裝HTTP的響應資訊,由於牽扯到緩衝的一些配置,所以在方法中添加了很多對緩衝的處理。這在C#2.0中非常重要,因為緩衝技術是提高Web效能的關鍵。下面對HttpResponse類中常用的方法及其說明:
典型應用:使用HttpResponse將網頁內容匯出到Word
利用HttpResponse的Write方法和BinaryWrite方法,使用HttpResponse可以輕鬆地實現網頁的匯出功能,包括匯出到PDF、Word和Excel等。其中BinaryWrite方法一般匯出的映像類型的檔案,而Write方法主要用來匯出一般字元串。本例的功能就是使用Write方法將文字框的內容匯出到Word中,這種功能通常用在文字編輯器中。
Response.Clear(); //清空無關資訊Response.Buffer = true; //完成整個響應後再發送Repsonse.Charset ="GB2312"; //設定輸出資料流的字元集:中文Response.AppendHeader("Content-Disposition","attachment;filename=Report.doc"); //追加頭資訊Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");//設定輸出資料流字元集Response.ContentType = "application/ms-word"; //輸出資料流的MIME類型Response.Write(TextBox1.Text);Response.End(); //停止輸出
應用程式狀態:HttpApplicationState類
HttpApplicationState類管理所有會話共用的資訊,即應用程式定義域級的資訊,凡是訪問次應用的會話都可以訪問這些資訊。可以說HttpApplicationState類是一個資料存放區庫,將資訊儲存在伺服器的記憶體中。這就保證了資料的讀取速度。HttpApplicationState類主要通過其內部對象“Application”來讀取和儲存資料,儲存資料的類型為“Object”,在讀取時必須進行正確的類型轉換。
文法定義:
HttpApplicationState類,其文法定義如下:
public sealed class HttpApplicationState:NameObjectCollecionBase
"NameObjectCollectionBase"是應用程式狀態的基類,表示鍵/值對的組合,所有值的類型都是Object。由於其繼承介面ICollecion,所以可以通過索引方法訪問這些集合資料。
HttpApplicationState類的使用通過其內部對象“Application”完成,樣本如下:
Application["ApplicationName"] = "School";
屬性詳解:
由於HttpApplicationState儲存的內容屬於鍵/值對,所以其屬性和大多數鍵/值對集合的成員相似,都具備Keys,Item和Count等屬性。下面列出這些屬性及其說明:
AllKeys :訪問資料集合的所有鍵
Contents :擷取資料集合的內容
Count : 擷取資料集合中的資料總數
Item : 擷取資料集合中某項
Keys : 擷取鍵集合
方法詳解:
既然需要在HttpApplicationState中儲存資料,就必須具備添加、刪除等資料的常用方法。
Add :添加資料到集合中
Clear : 清空集合中的資料
Get :通過索引擷取集合中的資料
GetKey:通過索引值擷取資料
Lock :鎖定集合,保持資料更新的同步
Remove :移除某變數
RemoveAll:移除所有的變數
RemoveAt :按索引移除集合中的某變數
Set :設定集合中某變數的值
UnLock :接觸對集合的鎖定
下面的代碼示範如何使用HttpApplicationState類中的方法:
Application.Add("name","cgj"); //添加一對索引值Response.Write(Application.Get("name").ToString()); //返回鍵的值Application.Add("age","12"); //再添加一對索引值Response.Write(Application.GetKey(0).ToString()); //返回第一個鍵的名稱Application.Lock(); //鎖定應用程式狀態,保持修改同步Application.Set("name","chengj"); //修改鍵name的值Application.UnLock(); //解鎖Application.RemoveAt(0); //移除第一個索引值對
典型應用:用HttpApplicationState類儲存資料庫連接串
資料庫連接串是一個應用程式級的變數。為了保證所有會話都可以訪問,本例將其存放在HttpApplicationState類中。這並不是最好的解決方案,因為.NET支援字串存放在設定檔中,達到全域調用的目的。
在應用程式開始的事件中“Application_Start”中,書寫如下代碼,主要用來添加連接字串的鍵/值對:
if(Application["ConnString"]==null)
Application["connString"] ="Data sourse=SERVER;Initial Catalog=Mis;uid=sa;pwd=;";
在Default.aspx頁的程式碼檢視中,
If(Application["ConnString"]!=null)
Response.Write(Application["ConnString"].ToString());
企業級應用:
/// <summary> /// 把對象放入到緩衝中 /// </summary> /// <typeparam name="T">WAFObject類型</typeparam> /// <param name="t">WAFObject對象</param> internal static void SetUserObject<T>(T t) where T : WAFObject { if (HttpContext.Current != null) { string guid = LoginUser.Guid; if (HttpContext.Current.Application[guid] == null) HttpContext.Current.Application.Add(guid, new SortedList<string, WAFObject>()); SortedList<string, WAFObject> list = HttpContext.Current.Application[guid] as SortedList<string, WAFObject>; string key = typeof(T).FullName; if (list.ContainsKey(key)) { list[key] = t; } else { list.Add(key, t); } } }
HttpCookie類
Cookie也用來儲存資料,但只針對單一使用者。其儲存的也是鍵/值對的集合,與HttpApplicationState類最大的區別就是有效期間。Application對象沒有任何有效期間,只有刪除才算這個對象的到期,而Cookie在建立時,可以指定這對鍵/值的到期時間。Cookie一般用來儲存登陸的使用者名稱和密碼,這樣在下次登陸時,就不需要再次填寫。這樣提高了使用者的工作效率,但存在一定的安全性問題。
文法定義
public sealed class HttpCookie
HttpCookie類的建構函式有兩種:一種是不為鍵賦值,另一種是指定鍵/值對。函數代碼分別如下:
public HttpCookie(string name)
public HttpCookie(string name,string value)
屬性詳解:
HttpCookie類包含訪問內部鍵/值對的一些屬性,如鍵的值、到期時間等。
Expires : Cookie的有效期間
HasKes :判斷Cookie是否具備子鍵
Item :按索引訪問Cookie集合中的變數
Name:Cookie的名稱
Path :與Cookie一同傳輸的虛擬路徑
Secure :是否使用Http傳輸Cookie
Value : 指定Cookie的值
Values :Cookie的值集合
典型應用:用HttpCookie儲存使用者的登陸資訊
HttpCookie的主要應用是儲存當前登陸使用者的一些常用資訊,這些資訊將儲存在用戶端的機器上。本例通過示範如何儲存當前的登入名稱和密碼。
Request.Cookies.Clear(); //清空所有CookieHttpCookie myname = new HttpCookie("UserInfo"); //建立HttpCookie的執行個體myname["name"] = TextBox1.Text; //儲存變數myname["pass"] = TextBox2.Text;/myname.Expires = DateTime.Now.AddHours(1); //設定Cookie的到期時間Repsonse.Cookies.Add(myname); //添加到web請求的Cookie集合中注意:配置好HttpCookie後,需要將其添加到Web請求的Cookies集合中在Page_Load事件中,擷取儲存的Cookie,代碼如下if(Request.Cookies["UserInfo"]!=null){ //擷取使用者名稱和密碼 TextBox1.Text = Request.Cookies["UserInfo"]["name"].ToString(); TestBox2.Text = Request.Cookies["UserInfo"]["pass"].ToString();}
URL的編碼/解碼:HttpUtility類
HttpUtility類主要提供對URL進行編碼和解碼的方法,這是出於對URL資料安全性的考慮,因為編碼後的資料無法被輕易地識別,如果想讀取URL的資料,必須再對其進行解碼。這樣也防止了Web用戶端的指令碼注入。HttpUtility類中全是編碼和解碼的方法,包括字串的編碼、位元組數組的編碼等。此類沒有提供任何屬性。
文法定義
HttpUtility類的文法定義如下:
public sealed class HttpUtility
“sealed”關鍵字表示此類是密封類,不能被繼承。
通常調用HttpUtility類的對象並不是通過執行個體化類完成的,而是通過調用內部的“Sever”對象,使用其公開的方法和屬性,但是Server並沒有完全支援這些方法。
HttpUtility類的內部方法多是靜態方法,這保證了無須執行個體化,就可以使用這些方法。如下所示:
HttpUtility.HtmlEncode(“This is test”);
方法詳解
HttpUtiity類主要實現字元和URL等資料的編碼和解碼,具體的方法如下:
HtmlDecode:對字串的解碼
HtmlEncode:對字串的編碼
ParseQueryString :分解查詢字串
UrlDecode :對URL傳輸的字串解碼
UrlDecodeToBytes:對URL傳輸的資料解碼成位元組組
UrlEncode :對URL傳輸的字串編碼
UrlEncodeToBytes :對URL傳輸的資料編碼成位元組組
UrlEncodeUnicodeToBytes:將Unicode資料轉換為位元組數組
UrlPathEncode :對傳輸路徑的編碼
下面示範如何使用HttpUtlity類中的方法:
HttpUtiltiy.HtmlEncode("this is test");
HttpUtility.HtmlDecode("this");
HttpUtility.UrlEncode("the world");
HttpUtility.UrlDecode("the world");
HttpUtility.UrlEncodeUnicode("the world");
NameValueCollection myValue = HttpUtility.ParseQueryString("name=cgj&age=28");
典型應用:使用頁面傳遞中文參數
在頁面之間傳遞中文一直是比較麻煩的事情,主要原因有兩個原因:一是安全性,二是經常會出現亂碼。在使用Javascript時,可以通過函數“escape”解決這個問題。在C#中可以使用HttpUtility類輕鬆解決次問題,通常比較大得網站都採用這種模式。
實現頁面之間的傳遞,Default.aspx頁面:
string strurl ="Default2.aspx";
string name = HttpUtility.UrlEncode("劉千千");//編碼
string type = HttpUtility.UrlEncode("電腦工程師");
Reponse.Redirect(strurl + "name=" +name+"&type=" +type); //導航
開啟“Default2.aspx”頁,在其“Page_Load”事件中書寫擷取傳遞參數的代碼,如下所示:
Response.Write(Request.Query["name"]); //擷取參數name
Response.write(Request.Query["type"]); //擷取參數type
按F5運行程式,可以看到頁面的URL已經不再顯示值的內容了,而是顯示一些雜亂的編碼。這就保證了參數的安全性。
上傳檔案的管理:HttpPostedFile
HttpPostedFile類管理的是用戶端上傳的單個檔案,而對所有檔案的管理則交給了“HttpFileCollection”類,其實HttpPostedFile類就是HttpFileCollection類的個體。
通過HttpPostedFile類可以擷取上傳檔案的一些屬性,如大小、檔案名稱等。還能利用此類提供的“SaveAs”方法儲存檔案。
文法定義:
HttpPostedFile類的文法定義如下:
public seald class HttpPostedFile
在實際的應用中,通常不需要通過new 來構造此類的執行個體,而是使用“FileUpload”控制項的“PostedFile”屬性獲得。使用方法如下:
HttpPostedFile myfile = FileUpload1.PostedFile;
屬性詳解:
HttpPostedFile類的屬性用來描述上傳檔案的一些基本資料。
ContentLength : 上傳檔案的長度
ContentType : 檔案的MIME類型
FileName : 檔案的路徑名稱
InputStream : 讀取檔案的Stream流
方法詳解:
HtttPostedFile類主要用來擷取上傳檔案的資訊,目前只提供一個“SavaAs”方法,用來將上傳的檔案儲存到伺服器。
SaveAs的使用文法如下:
public void SaveAs(string filename)
參數“filename”表示目標路徑和檔案名稱。
下面的代碼示範如何使用SaveAs方法:
myfile.SaveAs(@"c:\test.doc");
典型應用:根據上傳檔案的大小實現不同處理。
HttpPostedFile myfile = FileUpload1.PostedFile; //擷取上傳檔案執行個體//擷取檔案名稱string filename = myfile.FileName.Substring(myfile.FileName.LastIndexOf(@"\")+1);if(myfile.ContentLength>1024000) //判斷檔案大小 ,大於1MB myfile.SaveAs(@"C:\BigFile\" + filename); //C盤下必須有檔案夾“BigFile”else myfile.SaveAs(@"C:\SmallFile\" + filename); //C盤下必須有檔案夾“SmallFile”Response.Write("儲存成功");
應用程式的運行時服務:HttpRuntime
HttpRuntime類用來提供ASP.NET的運行時服務,主要針對的是當前啟動並執行應用程式。通過此類提供的方法和屬性,可以獲得應用程式的一些基本資料。HttpRuntime類中最重要的是方法“ProcessRequest”,用來處理所有的Web後續操作。通過瞭解次方法,可以瞭解應用程式的運行過程。
封裝HTTP請求的資訊:HttpContext
HttpContext是Web應用中很重要要的一個類,之所以將其放在後面講,是因為其屬性是很多類的執行個體對象,“HttpResponse”、“HttpRequest”和"TraceContext"等。下面重點介紹HttpContext的屬性,其封裝了Http請求的所用資訊。
HttpContext類管理著Http請求的所有屬性,包括請求的輸入資料流、輸出資料流、當前請求的使用者和緩衝對象等。HttpContext類是web請求的上下文環境,每一次請求都伴隨一個HttpContext對象,用來封裝請求的相關資訊。這些資訊如果要分類,主要有響應類(Response)、請求類(Request)、會話類(Session)、緩衝類(Cache)和跟蹤類(Trace)等。當請求結束時,這個請求的HttpContext對象也就消失了。
文法定義
HttpContext類的文法定義如下:
public sealed class HttpContext:IServiceProvider
"sealed"關鍵字表示此類時封閉類,不能被繼承。HttpContext類實現介面“IServiceProvider”,其用來檢索服務物件。
在使用HttpContext類時,通常不需要初始化,對其屬性和成員可以直接調用。HttpContext類的調用文法如下:
HttpRequest myreq = HttpContext.Current.Request;
屬性詳解
HttpContext類描述了當前請求中的所有屬性,下面列出這些屬性及其說明。
AllErrors : Http請求中發生的所有錯誤
Application:當前Http請求的Application對象
ApplicationInstance :為當前Http設定Application對象
Cache:當前http的Cache對象
Current:當前http的HttpContext對象
Error :當前請求的第一個錯誤
IsCustomErrorEnabled :是否啟用自訂錯誤
IsDebuggingEnabled :是否處於偵錯模式
Items :Http請求的項集合
Profile :目前使用者的設定檔
Request :當前請求的HttpRequest對象
Reponse:當前請求的HttpReponse對象
Server :用於處理請求的編碼對象
Session:當前請求的Session對象
SkipAuthoriaztion:是否跳過授權檢查
TimeStamp:當前請求的初始時間戳記
Trace :當前響應的TraceContext對象
User :設定目前使用者資訊
方法詳解
HttpContext類的方法主要擷取一些配置資訊,其中最重要的方法是“RewritePath” ,用來重新導向URL。
下面對HttpContext類的常用的方法進行說明:
AddError :將錯誤資訊添加到錯誤集合
ClearError :清空錯誤資訊
GetAppConfig : 擷取當前應用程式的配置資訊。
GetConfig:擷取當前請求的配置資訊
GetGlobalResourseObject: 擷取應用程式級資源。
GetLocalResourseObject :擷取頁面級資源。
GetSection :擷取配置節資訊
RewritePath :重寫路徑.
HTTP處理常式:IHttpHandler介面
IHttpHandler介面主要用來自訂HTTP處理常式。例如當使用者訪問某一頁面時,程式員可以通過實現此介面的方法“ProcessRequest”,來重新處理是否讓使用者看到則一頁。
自訂處理常式可以用符合CLS規範的任何語言編寫。當編寫完成自訂的處理常式後,使用者的請求不再通過ASP.NET的頁面來響應,而是通過IHttpHanlder介面實現的“ProcessRequest”方法來響應。
IHttpHandler的用途很廣泛,例如比較流行的Blog登出技術和特殊副檔名的訪問技術。這些技術都是通過實現IHttpHandler介面,來達到頁面的處理功能。
文法定義:
IHttpHandler是一個介面,其定義如下
public interface IHttpHandler
介面一般用來封裝一些固定的操作方法,但並不實現這些方法,所以繼承此介面的類必須實現介面中定義的方法。IHttpHandler介面定義的內容如下,其中包括一個屬性和一個方法。
#region IHttpHandler成員
bool IHttpHandler.IsReusable
{
get{ throw new Exception("The mothod or operation is not implemented."); }
}
void IHttpHandler.ProcessRequest(HttpContext context)
{
throw new Exception("the method or operation is not implemented");
}
#endregion
方法詳解:
IHttpHnndler介面只有一個方法"ProcessRequest",主要用來處理Web請求。其文法定義如下:
void ProcessRequest(HttpContext context)
方法的參數"context"是當前HTTP請求的上下文,包括緩衝、當前請求和響應等。
ProcessRequest方法是IHttpHandler介面的關鍵所在。在Web中常看到的Page類,就繼承了IHttpHanlder介面,並實現了自己的ProcessRequest方法。通過瞭解此介面,也能更好地瞭解WebPage頁面的運行原理。
典型應用:用IHttpHandler實現Blog的登出技術
所謂的Blog登出技術,其實就是當使用者單擊"登出"按鈕時,頁面URL顯示的是登出介面,而實際上並沒有這個登出頁的存在,這就是利用IHttpHandler介面技術。
雙擊"登出"按鈕,切換到其Click事件的程式碼檢視,書寫如下:
Response.Redirect("SigeOut.aspx"); 注意:網站中不存在"SigeOut.aspx"這個網頁。
在網站的根目錄下,添加一個類"SigeOutHandler",系統會詢問是否將類儲存在"App_Code"目錄中,選擇"是"。
設計“SigeOutHandler”類的代碼如下,其中實現了介面“IHttpHandler”中的方法“ProcessRequest”。
using system;using System.Web;using System.Web.Security;public class SigeOutHandler : IHttpHandler{ public SigeOutHandler(){} bool IHttpHandler.IsReusable//使用上下文緩衝 { get{return true;} } void IHttpHandler.ProcessRequest(HttpContext context) { FormsAuthentication.SignOut(); //刪除驗證票據 HttpContext.Current.Response.Write("您已經成功登出"); //顯示成功資訊 }}
在Web.Config檔案中的“system.web”節點下,添加使用者自訂處理的配置,如下所示:
<httpHandler>
<add verb ="*" path ="SigeOut.aspx" type = "SigeOutHandler"/>
</httpHandler>
注意:本例中使用了登陸使用者控制項,需要在Web.Config中設定登陸模式為“Forms”。
註冊一個使用者登陸,然後單擊“登出”按鈕,此時網頁顯示的頁面URL是“http://localhost/HttpHandleSample/SigeOut.aspx”,但實際上並不存在這個頁面,所有的處理都是在“ProcessRequest”方法中實現的。
Http處理模組:IHttpModule介面