WP7开发之HttpWebRequest基本的GET请求

作者:袖梨 2022-06-26

一、预备知识:

什么是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.**baid*u.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.*w**eibo.com/s/3baOy

相关文章

精彩推荐