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