System.Web

來源:互聯網
上載者:User

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介面

 

聯繫我們

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

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

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.