`
isiqi
  • 浏览: 16034241 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Windows Phone 7(WP7)开发 网络操作(1) HttpWebRequest基本的GET请求

 
阅读更多

一、预备知识:

  什么是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

posted @2012-03-14 14:14锦燕云阅读(1514) 评论(5)编辑收藏
 回复 引用 查看 
#1楼2012-03-14 16:57|江大鱼
不知道在WP中用ThreadPool是否更好一点,直接使用线程池中的线程:
ThreadPool.QueueUserWorkItem(() => ....);
因为创建一个线程也需要花费时间。

 回复 引用 查看 
#2楼[楼主]2012-03-14 17:09|锦燕云
引用 江大鱼:
不知道在WP中用ThreadPool是否更好一点,直接使用线程池中的线程:
ThreadPool.QueueUserWorkItem(() => ....);
因为创建一个线程也需要花费时间。
刚才写文章只在想网络这块,没在线程的问题上多想,谢谢提醒~呵呵。

ThreadPool.QueueUserWorkItem(obj =>webRequest.BeginGetResponse(new AsyncCallback(HandleResponse), webRequest));
 回复 引用 查看 
#3楼2012-03-14 18:50|瞬间飞舞
建议你不要使用这样方式,因为只会支持get,post,可以尝试使用RestSharp这样会比较好一些,而且支持的动词会多一起,可以减少很多的代码量
 回复 引用 查看 
#4楼[楼主]2012-03-14 18:59|锦燕云
引用 瞬间飞舞:建议你不要使用这样方式,因为只会支持get,post,可以尝试使用RestSharp这样会比较好一些,而且支持的动词会多一起,可以减少很多的代码量
找时间研究一下,之前还真不知道这个…… 刚百度了一下,感觉还不错。
 回复 引用 查看 
#5楼2012-03-21 14:23|豆约翰
Windows Phone 7(WP7)开发 网络操作(1) HttpWebRequest基本的GET请求
谢谢分享。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics