一、預備知識:
什麼是Get請求?什麼是Url?請直接Baidu,Google,Bing。
二、WP7的網路操作:非阻塞的非同步作業(暫時還沒有看到直接的同步的操作的方式)。
三、主要代碼:
public class Http
{
public delegate void HandleResult(string result);
private HandleResult handle;
public void StartRequest(string Url, HandleResult handle)
{
this.handle = handle;
var webRequest = (HttpWebRequest)WebRequest.Create(Url);
webRequest.Method = "GET";
try
{
webRequest.BeginGetResponse(new AsyncCallback(HandleResponse), webRequest);
}
catch
{
}
}
public void HandleResponse(IAsyncResult asyncResult)
{
HttpWebRequest httpRequest = null;
HttpWebResponse httpResponse = null;
string result = string.Empty;
try
{
httpRequest = (HttpWebRequest)asyncResult.AsyncState;
httpResponse = (HttpWebResponse)httpRequest.EndGetResponse(asyncResult);
using (var reader = new StreamReader(httpResponse.GetResponseStream(), Encoding.UTF8))
{
result = reader.ReadToEnd();
reader.Close();
}
}
catch
{
}
finally
{
if (httpRequest != null) httpRequest.Abort();
if (httpResponse != null) httpResponse.Close();
}
handle(result);
}
}
四、使用:
這是一個簡單的Get操作封裝類,使用的時候只需要做如下調用:
var http = new Http();
http.StartRequest(@"http://www.baidu.com",
result=>
{
//處理返回結果result
});
StartRequest的第一個參數為請求的Url,當然這裡為了簡便唯寫了百度的網址。
第二個參數是我們對結果的處理代理函數,這裡為了簡便直接使用了匿名方法。
五、問題與分析:
1、如果是需要在獲得請求結果之後,對介面的元素進行操作,別忘記在handle中使用Deployment.Current.Dispatcher.BeginInvoke(),或者,一個更直接的辦法,就是對上面的HandleResponse的最後一句做一點修改,改為: Deployment.Current.Dispatcher.BeginInvoke(()=>handle(result));
2、有一種極端的情況,即網路情況不好,而請求需要發送的資料又足夠長,這種請求會持續數秒,假設是介面上的一個按鈕按下的處理事件調用此網路請求,介面將會卡死。這裡有一個很容易進入誤區:以為WP7的網路都是非同步,就可以不使用多線程了。在大部分時候,此誤區並不容易被發現,主要就是網路都不算壞,而且Get的請求發送資料量都不算多,但現在討論的是極端情況,為了完美與良好的使用者體驗,在這個問題上下一點功夫還是值得的。WP7的非同步,只是發送完請求與等待請求的非同步,而發送請求的過程,還是同步的狀態,所以,需要對上面的StartRequest方法還需要進行改造:
webRequest.BeginGetResponse(new AsyncCallback(HandleResponse), webRequest);
換成:
new Thread(() =>webRequest.BeginGetResponse(new AsyncCallback(HandleResponse), webRequest)).Start();
(不得不說,C#的匿名函數給我們提供了很大的方便。)
六、附源碼:
http://vdisk.weibo.com/s/3baOy
轉載請註明出處:
Windows Phone 7(WP7)開發 網路操作(1) HttpWebRequest基本的GET請求
錦燕雲
http://www.cnblogs.com/vistach/archive/2012/03/14/Windows_Phone_WP7_Net_Http_HttpWebRequest_Get.html