WebClient与WebRequest差异

WebRequst的使用

     WebClient和HttpWebRequst是用来获取数据的2种方式,在我的这篇数据访问(2)中主要是讲的WebClient的使用,一般而言,WebClient更倾向于“按需下载”,事实上掌握它也是相对容易的,而HttpWebRequst则允许你设置请求头或者对内容需要更多的控制,后者有点类似于form中的submit。虽然两者都是异步请求事件,但是WebClient是基于事件的异步,而HttpWebRequst是基于代理的异步编程,下面就用简单的需求两者比较用法上的不同:

    需求很简单,获取Web端的图片然后显示出来,结构如右边所示

 

捕获捕获

  UI很简单:
 <StackPanel Background="White">
            <Button Width="250"
                    Content="HttpWebRequest"
                    Click="Button_Click" />
            <Button Width="250"
                    Content="Click for request with WebClient"
                    Click="Button_Click_1" />
            <TextBox  Text="1"
                      x:Name="numTextBox"
                      Width="20" />
            <Image Height="150"
                   Name="image1"
                   Stretch="Fill"
                   Width="200" />
        </StackPanel>

  页面上提供一个TextBox用来输入文件名的,先看一看WebClient获取图片并显示在Image的过程

       //使用WebClient
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            string baseUri = String.Format("http://localhost:49280/Images/{0}.jpg", this.numTextBox.Text.Trim());
            Uri uri = new Uri(baseUri, UriKind.Absolute);
            WebClient client = new WebClient();
            client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);
        }
        void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
        {            
            Stream stream = e.Result;
            BitmapImage bitmap = new BitmapImage();
            bitmap.SetSource(stream);
            this.image1.Source = bitmap;
        }

因为之前已经对WebClient总结过了,所以就不再重复了,主要是看一看WebRequst如果要实现相同的代码的过程

       //使用WebRequest
        private void Button_Click(object sender, RoutedEventArgs e)
        {
             string baseUri =String.Format("http://localhost:49280/Images/{0}.jpg",this.numTextBox.Text.Trim());
             HttpWebRequest request =(HttpWebRequest) WebRequest.Create(baseUri);
             request.Method = "GET";
             request.BeginGetResponse(new AsyncCallback(ReadCallback), request);
        }
        public void ReadCallback(IAsyncResult asyc)
        {
            HttpWebRequest request = (HttpWebRequest)asyc.AsyncState;        
            HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyc); 
                 this.Dispatcher.BeginInvoke(() =>
                     {
                         Stream stream = response.GetResponseStream();
                         BitmapImage bitmap = new BitmapImage();
                         bitmap.SetSource(stream);
                         this.image1.Source = bitmap;
                     }
                     );
         }

几点需要注意的地方: 1,HttpWebRequest是个抽象类,所以无法new的,需要调用HttpWebRequest.Create();

                            2,其Method指定了请求类型,这里用的GET,还有POST;也可以指定ConentType;

                            3,其请求的Uri必须是绝对地址;

                            4,其请求是异步回调方式的,从BeginGetResponse开始,并通过AsyncCallback指定回调方法;

                            5,因为其回调不是UI线程,所以不能直接对UI进行操作,这里使用Dispatcher.BeginInvoke()

主要是第4点,如果把上面的代码中回调方法改成这样下面的样子的话,VS会提示跨域线程访问无效

  HttpWebRequest request = (HttpWebRequest)asyc.AsyncState;
  HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyc);        
  Stream stream=response.GetResponseStream();
  BitmapImage bitmap = new BitmapImage();
  bitmap.SetSource(stream);
  this.image1.Source = bitmap;
posted @ 2010-08-13 08:17  ringgo  阅读(9908)  评论(10编辑  收藏  举报