热门:网页模板.net视频教程JQueryMVCjsonExtJs源码示例三级联动JQuery菜单
您现在的位置:.Net中文社区>> Silverlight>>正文内容

WebClient与WebRequest差异

发布时间:2010年08月13日点击数: 佚名

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

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

 

捕获捕获

  UI很简单:
  1. <StackPanel Background="White"> 
  2.             <Button Width="250" 
  3.                     Content="HttpWebRequest" 
  4.                     Click="Button_Click" /> 
  5.             <Button Width="250" 
  6.                     Content="Click for request with WebClient" 
  7.                     Click="Button_Click_1" /> 
  8.             <TextBox  Text="1" 
  9.                       x:Name="numTextBox" 
  10.                       Width="20" /> 
  11.             <Image Height="150" 
  12.                    Name="image1" 
  13.                    Stretch="Fill" 
  14.                    Width="200" /> 
  15.         </StackPanel> 

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

  1. //使用WebClient 
  2.        private void Button_Click_1(object sender, RoutedEventArgs e) 
  3.        { 
  4.            string baseUri = String.Format("http://localhost:49280/Images/{0}.jpg"this.numTextBox.Text.Trim()); 
  5.            Uri uri = new Uri(baseUri, UriKind.Absolute); 
  6.            WebClient client = new WebClient(); 
  7.            client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted); 
  8.        } 
  9.        void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 
  10.        {             
  11.            Stream stream = e.Result; 
  12.            BitmapImage bitmap = new BitmapImage(); 
  13.            bitmap.SetSource(stream); 
  14.            this.image1.Source = bitmap; 
  15.        } 

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

  1. //使用WebRequest 
  2.         private void Button_Click(object sender, RoutedEventArgs e) 
  3.         { 
  4.              string baseUri =String.Format("http://localhost:49280/Images/{0}.jpg",this.numTextBox.Text.Trim()); 
  5.              HttpWebRequest request =(HttpWebRequest) WebRequest.Create(baseUri); 
  6.              request.Method = "GET"
  7.              request.BeginGetResponse(new AsyncCallback(ReadCallback), request); 
  8.         } 
  9.         public void ReadCallback(IAsyncResult asyc) 
  10.         { 
  11.             HttpWebRequest request = (HttpWebRequest)asyc.AsyncState;         
  12.             HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyc);  
  13.                  this.Dispatcher.BeginInvoke(() => 
  14.                      { 
  15.                          Stream stream = response.GetResponseStream(); 
  16.                          BitmapImage bitmap = new BitmapImage(); 
  17.                          bitmap.SetSource(stream); 
  18.                          this.image1.Source = bitmap; 
  19.                      } 
  20.                      ); 
  21.          } 

几点需要注意的地方: 1,HttpWebRequest是个抽象类,所以无法new的,需要调用HttpWebRequest.Create();
                            2,其Method指定了请求类型,这里用的GET,还有POST;也可以指定ConentType;
                            3,其请求的Uri必须是绝对地址;
                            4,其请求是异步回调方式的,从BeginGetResponse开始,并通过AsyncCallback指定回调方法;
                            5,因为其回调不是UI线程,所以不能直接对UI进行操作,这里使用Dispatcher.BeginInvoke()
主要是第4点,如果把上面的代码中回调方法改成这样下面的样子的话,VS会提示跨域线程访问无效

  1. HttpWebRequest request = (HttpWebRequest)asyc.AsyncState; 
  2.  HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyc);         
  3.  Stream stream=response.GetResponseStream(); 
  4.  BitmapImage bitmap = new BitmapImage(); 
  5.  bitmap.SetSource(stream); 
  6.  this.image1.Source = bitmap; 

本站热点业务

更多模板/案例展示

关于我们 | 联系我们 | 团队日志 | 网站地图 | 网站合作