Windows Phone 7 – WebClient與HttpWebRequest的使用差別

來源:互聯網
上載者:User

這篇文章將先針對WebClient做說明,另外會接著介紹相關於HttpWebRequest的使用,以及這二個類別之間的差異與對於WP7的一個影響。

在討論WebClient與HttpWebRequest之前,要先瞭解一下一個蠻重要的類別:WebRequest類別。

‧WebRequest

它是.NET Framework進行處理網際網路資源要求(WebRequest)與回應(WebResponse)的主要模型。屬於Abstract類別。沒有辦法直接透過建構子實作,需使用:WebRequest.Create方法來建立實體來進行運用。該類別還有其他相關不同於通訊協定的類別,包括:WebRequestMethod.File、WebRequestMethod.Ftp與WebRequestMethod.Http。更詳細的使用方法,可以參考< 如何使用WebRequest類別要求資料 >這篇有詳細的說明。


然而,在Silverlight所支援的Syste.Netm命名空間裡,目前僅支援:WebRequest、WebResponse、WebClient與HttpWebRequest等類別,雖然缺少了WebRequestMethod.Ftp或FtpWebRequest就代表Silverlight沒法支援FTP了嗎?答案是否定的。因為WebClient還是可以做到相同的效果(但需注意Timeout問題),因為WebClient是一個非常特別好用的封裝後類別,讓我們開發人員非常容易就可以撰寫出擷取網路資源的程式。另外,也可以參考以下的文章:Silverlight 3 File Transfer Application。


那麼接下來就回到主題裡,談論相關於Silverlight下的WebClient與HttpWebRequest二個常用於Silverlight的類別。

‧WebClient

WebClient使用WebRequest類別提供對資源的存取。WebClient類別相較於HttpWebRequest類別,它比較像是個被封裝完成專門處理網路資源存取的類別,例如:依照預設值,當使用WebClient時,該執行個體是不會傳送選擇性的Http標題,也就是它會依舊你使用的URI產生相對應的Http Header內容,讓接收端可以有效擷取需要的內容。這樣的好處可以讓開發人員依基本的Header來完成任務。但其實對於Header的使用,還是有其限制在的,可以參考

< WebHeaderCollection類別 >這篇文章的介紹,裡面提供了那些Header可以操作來向接收端進行溝通。

Method

Description

OpenWriteAysnc

以非同步方式擷取用於將資料傳送至資源的Stream,而不封鎖呼叫的執行緒。使用POST命令上傳HTTP資源。該方法將資料轉入資料流中進行傳送。

UploadStringAsync

將String傳送至資源,而不封鎖呼叫的執行緒。指定上傳的URI必須識別出可以接受使用POST方法傳送之要求的資源。

DownloadStringAsync

從資源下載String,而不封鎖呼叫的執行緒。採用GET方法向URI下載指定資源。

OpenReadAsync

以非同步方式從資源傳回資料,而不封鎖呼叫的執行緒。採用下載封裝的方式,讓資源回傳時是屬於一個獨立的檔案集合。採用GET方法向URI下載指定資源。

上方四種是常用於非同步作業使用的方法。然而在使用WebClient類別需要注意Silverlight針對網路存取的限制,可以參考:< Silverlight中的網路安全性存取限制 >與< Silverlight中的URL存取限制 >。另外,也許你會像我一樣不太瞭解為何有一個DownloadStringAsync或UploadStringAsync的方法出現,因為在網路上搜尋看到WebClient類別的範例都是使用另外二種:OpenWriteAsync與OpenReadAsync來儲存網路資源。也許你可以依照下方的分類來按需求使用:

〉DownloadStringAsync/UploadStringAsync:適用於當接收端接受傳送資料的類型,例如:XML、JSON等其他相關文字類型。

〉OpenWriteAsync/OpenReadAsync:適用接收端使用POST方式接收/取得資料流的類型,例如:可轉成Stream的資料料型。


HttpWebRequest

它是WebRequest的子代類別,實作WebRequest提供的方法與屬性,主要針對Http Protocol進行處理,內部包括了Header、Content等一般在ASP.NET網頁中Request看到的屬性。讓使用者可以直接與Http伺服器進行溝通,例如:Get或Post。它使用的方法,如同WebRequest類別的用法:WebRequest.Create根據URI中的http或https回傳HttpWebRequest物件。

然而使用HttpWebRequest特別注意:「Silverlight執行階段會限制HttpWebReuqest類別從特定的Header傳送到跨網域網站」該限制主要是避免程式進行跨網域存取的問題,造成類別跨網域攻擊的事件發生,也能確保資源是安全與規範下的存取。另外,更詳細說明安全性的問題可以參考:< Silverlight中的網路安全性存取限制 >與< Silverlight中的URL存取限制 >。


主要使用的Method:

Method Name

Description

BeginGetResponse

開始對網際網路資源的非同步要求。

EndGetResponse

結束對網際網路資源的非同步要求。需使用IAsyncResult處理回傳結果。

BeginGetRequestStream

開始用來寫入資料之Stream物件的非同步要求。

EndGetRequestStream

結束用來寫入資料之Stream物件的非同步要求。需使用IAsyncResult處理回傳結果。

以上二組方法均是Request/Response的相對應(另外還有GetResponse()等支援同步作業的方法)。由於二者均屬於非同步的呼叫,因此另外有二個重要的類別需要注意:

〉AsyncCallback委派

提供讓使用者端應用程式完成非同步的作業。在啟始非同步作業時,提供戶用端這個回呼委派。AysncCallback所參考的事件處理常式包含完成處理非同步作業的工作邏輯。然而回傳的結果則語IAsyncResult介面來控制。


〉IAsyncResult介面

由執行非同步作業方法的類別所實作。代表非同步作業開始與結束的回傳型別(Return Type)。它會配搭非同步作業完成時,交由AsyncCallback委派所叫用(invoke)的方法回傳資訊。


以下舉了一個簡單的使用範例:

我實作了一個Default.aspx的網頁,接受透過GET的方法把User的帳號與密碼送到該網頁來取得驗證的動作。(範例有點不好,但重點在說明如何使用HttpWebRequest類別)。

private void button1_Click( object sender, RoutedEventArgs e)

{

//建立HttpWebReuqest實體

HttpWebRequest tHReuqest = WebRequest.CreateHttp( "http://localhost:1294/Default.aspx?UID=pou&PWD=pou1234" );

//使用AsyncCallback委派,來完成非同步的作業。

tHReuqest.BeginGetResponse( new AsyncCallback(ResponseCallback), tHReuqest);

}

private void ResponseCallback(IAsyncResult asynchronousResult)

{

//使用AsyncCallback委派需要實作IAsyncResult介面來取得非同步作業的狀態。

HttpWebRequest tRequest = (HttpWebRequest)asynchronousResult.AsyncState;

HttpWebResponse tResponse = (HttpWebResponse)tRequest.EndGetResponse(asynchronousResult);

using (StreamReader tResponseStream = new StreamReader(tResponse.GetResponseStream()))

{

string strResult = tResponseStream.ReadToEnd();

//將Response內容讀入後,透過呼叫UI Thread來修改畫面中元件的顯示。

Dispatcher.BeginInvoke(() =>

{

textBox1.Text = strResult;

});

}

}

‧WebClient & HttpWebRequest 不同之處

WebClient與HttpWebReuqest對於我剛學習Silverlight時,我一直搞不清楚何該用那一種類型會比較適用,也許你參考過這一篇< Using WebClient and HttpWebRequest >,它裡面也提及由於二個類別使用,如果是用於比較單純的情境(例如:單純透過GET去取得指定URI所回傳的內容或檔案),二者的差異是比較小的,也就比較容易造成混淆。但是如果按照上述所描述二者各自的用途與功能後,可以容易將二者的差異,透過從下方一段話來加以分解:


〉WebClient:使用容易,直接使用即可用於擷取或下載Web Service上的資源與內容,甚至支援FTP。

〉HttpWebRequest:使用較複雜,但提供豐富的功能於自訂需要的Header或是其他的資源,協助完成特定工作。


的確,WebClient的使用上,其實不用太過於在意Http Header上參數的控制與應用,相對於HttpWebReqeust使用是非常簡單的( 但這不表示WebClient就不能調整需要的Header內容,可透過WebClient的Header屬性來調整需要的Header )。

以上這隻是個簡單的分類,實際的使用情境與考慮的因素,我們可以參考以下這一篇的內容:


< 使用Silverlight的HTTP通訊和安全性 >,我將摘錄其中我覺得比較重要的部分,可以協助剛學習Silverlight時,可以清楚的理解二者之間的差異性。


〉HTTP 通訊情節和建議做法

以下此表主要擷錄< 使用Silverlight的HTTP通訊和安全性 >中的"HTTP通訊情節和建議做法"來加以說明:

序號

情節

建議方式

1

在相同網域中,下載及上傳資源。

使用WebClient類別。如需詳細資訊,請參閱視需要下載內容。

2

呼叫裝載於相同網域中的HTTP 架構Web 服務。

使用WebClient類別或HttpWebRequest / HttpWebResponse類別。如需詳細資訊,請參閱HOW TO:對以HTTP為基礎的服務發出要求[SilverLT4]。

3

呼叫裝載於相同網域中的SOAP、WCF 或ASP.NET AJAX Web 服務。

呼叫為Web服務所產生的Proxy。如需詳細資訊,請參閱使用Proxy建置和存取服務[Silverlight]。

如果您不想要使用Proxy,請使用HttpWebRequest / HttpWebResponse類別。

4

處理來自Web 服務的XML、JSON 或RSS 資料。

使用WebClient類別或HttpWebRequest / HttpWebResponse類別。如需詳細資訊,請參閱直接存取以HTTP和REST為基礎的服務[SilverLT4]或HOW TO:使用LINQ to XML從任意URI位置載入XML檔案。

5

呼叫位於不同網域上的Web 服務。

確定使用者端存取原則檔位於網域根目錄。使用Proxy、WebClient類別或HttpWebRequest / HttpWebResponse類別。如需詳細資訊,請參閱讓服務可跨網域界限使用[SilverLT4]。

6

傳送PUT、DELETE 和其他HTTP 方法,包括自訂方法。

確定使用者端存取原則啟用其他HTTP方法。請指定使用者端HTTP處理,並依照一般方式使用HttpWebRequest / HttpWebResponse類別。如需指定使用者端HTTP處理的詳細資訊,請參閱HOW TO:指定瀏覽器或使用者端HTTP處理。

7

對跨網域POST 要求設定要求標題。

確定依使用者端存取原則檔允許標題。

對於有關資料上傳的要求標題,請使用WebClient類別。將其Headers屬性設定為所需的標題集合。

針對其他案例,請使用HttpWebRequest類別。將其Headers屬性設定為所需的標題集合。如需允許的標題清單,請參閱HttpWebRequest.Headers。

8

使用所有方法傳送要求標題。

請指定使用者端HTTP處理,並依照一般方式使用HttpWebRequest / HttpWebResponse類別,同時視需要設定Headers屬性。

9

傳送要求至傳回錯誤碼和SOAP 錯誤的SOAP 服務

請指定使用者端HTTP處理,並依照一般方式使用HttpWebRequest / HttpWebResponse類別,以擷取發生錯誤的訊息主體。如需指定使用者端HTTP處理的詳細資訊,請參閱HOW TO:指定瀏覽器或使用者端HTTP處理。

10

將GET 要求傳送至需要Referer 標題的Web 服務。

請指定使用者端HTTP處理,並依照一般方式使用HttpWebRequest / HttpWebResponse類別。如需指定使用者端HTTP處理的詳細資訊,請參閱HOW TO:指定瀏覽器或使用者端HTTP處理。

從上表舉出的情境都是在使用WebClient或HttpWebRequest常遇到的,然而你可以從序號:1、2、4與7這四個情境發現,WebClient使用的情境均比較屬於單純的情境,例如:上傳、下載或常見的Header標題應用。另外:HttpWebReqeust提供的使用情境,就包括比較豐富的客制Http Header應用,指定的Web Service、WCF或特定Http Method的應用。上表只能提供一個大概的應用模式。其實還是需要按照開發時遇到的情境為主才能找到適用的方法與內容。


另外,更要特別注意Silverlight在於跨網域限制的定義與相對應作業(重點:Silverlight針對不同網域存取時,會先向另一個網域要求一份"使用者端存取原則檔/跨網域原則檔",根據原則中定義的規格來識別該服務是否支援跨網域的應用)。補充下列幾篇文章有定義原則檔的說明與安全性定義:< 讓服務可跨網域界限使用[SilverLT4] >與< 服務存取的其他安全性考量[SilverLT4] >。


以上是自我整理閱讀WebClient與HttpWebRequest二種類別上的小小心得,因為二者的使用本身也還沒有用的非常深入,只能照目前閱讀的結果提供一些簡單的歸納。希望能有所協助。感謝。如果有錯誤,也請多指導。謝謝。

 

 

http://www.hugwp.com/thread-2736-1.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.