Windows Phone 7 - 使用HttpWebRequest的相關事項

Windows Phone 7 - 使用HttpWebRequest的相關事項

之前撰寫了<Windows Phone 7 – 使用WebClient與HttpWebRequest的差異>一文,得到很多回饋與建議,

很感謝閱讀該篇文章後一起討論的朋友們。因此,我把最近處理HttpWebRequest問題的心得加以整理,

提供在該篇文章,繼續來補充相關的內容。

 

〉WP7.1 SDK之後,無法在使用WebRequest.Create(string)語法建立HttpWebRequest

     由於WP7在處理HttpWebRequest時,僅支援非同步處理,因此,7.1 SDK裡針對HttpWebRequest做了

一些相關的調整。那現在該怎麼來使用呢?

   1: private void CreateRequest(string pUrl)
   2: {
   3:     //第四行的程式,目前已不支援7.1 SDK,請改用第五行直接由HttpWebRequest進行Create;
   4:     //HttpWebRequest tHRequest = (HttpWebRequest)WebRequest.Create(pUrl);
   5:     HttpWebRequest tHRequest = HttpWebRequest.CreateHttp(pUrl);
   6:     tHRequest.BeginGetResponse(new AsyncCallback(ResponseCallback), tHRequest);
   7: }
   8:  
   9: protected virtual void ResponseCallback(IAsyncResult asynchronousResult)
  10: {
  11:     HttpWebRequest tRequest = (HttpWebRequest)asynchronousResult.AsyncState;
  12:     HttpWebResponse tResponse = (HttpWebResponse)tRequest.EndGetResponse(asynchronousResult);
  13:     if (tResponse.StatusCode == HttpStatusCode.OK)
  14:     {
  15:        using (StreamReader tResponseStream = new StreamReader(tResponse.GetResponseStream()))
  16:        {
  17:            //將結果讀取出來
  18:            gHTMLSource = tResponseStream.ReadToEnd();
  19:        }
  20:     }
  21: }

 

〉HttpWebRequest自動cache,造成取得相同的Response結果

     當實例化一個HttpWebRequest物件後,如果沒有特別去告訴它不做Cache,它預設是會做Cache的,即便該物件只是區域

變數一樣會有這樣的問題。除非使用HttpWebRequest時您有特別需用到cookie container,此部分就需要額外搭配其他方式。

如果您只是不希望它自動幫忙做Cache的話,根據GET與POST不同,需要在Http Header中告訴該HttpWebRequest要怎麼做

 

‧要求在GET時,不做Cache

   1: private void CreateRequest(string pUrl) 
   2: {
   3:     HttpWebRequest tHRequest = HttpWebRequest.CreateHttp(pUrl);
   4:     //使用時間戳的方式,在Header加上對IfModifiedSince的定義值
   5:     tHRequest.Headers[HttpRequestHeader.IfModifiedSince] = DateTime.Now.ToString();
   6: }

 

‧要求在POST時,不做Cache

   1: private void CreateRequest(string pUrl)
   2: {
   3:     HttpWebRequest tHRequest = HttpWebRequest.Create(pUrl);
   4:     httpRequest.Method = "POST"; 
   5:     //透過設定Http Header中的Pragma, Cache-Control來告知不做Cache
   6:      httpRequest.Headers["Pragma"] = "no-cache";
   7:      httpRequest.Headers["Cache-Control"] = "no-cache";
   8:      httpRequest.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";
   9: }

 

〉WebBrowser動態指定URL,畫面內容不會更新的問題

     最近除了使用HttpRequest、WebClient之外,也使用WebBrowser來處理因為HttpRequeset、WebClient只能支援UTF-8 Encoding的問題,

透過WebBrowser控件確實可以處理編碼問題,但也在處理動態時要特別的小心。尤其遇到一些網站會針對Cookie有特別判斷的時候,

如果WebBroser是需要動態多組URL指定後取得內容的,建議使用區域變數的方式,讓AsyncPOST自行處理就好。如下範例:

 

======

以上是分享相關開發HttpWebRequest遇到問題的解法,如果大家有相關要補充或討論也歡迎留言給我喔。謝謝大家。

 

References:

HTTPWebrequest Caching Data & httpwebrequest fetching same data

Windows Phone 7 HttpWebRequest returns same response from Cache (該篇提供了Server端處理的方式)

WP7 网络操作之HttpWebRequest & WebClient Caching Problem

[一般问题] WP7中发送HttpWebRequest请求是关闭缓存

Can't find HttpWebRequest.GetResponse() in WP7 Project

 

Dotblogs Tags: