• 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;
  • 相关阅读:
    redis zset 延迟合并任务处理
    String忽略大小写方法compareToIgnoreCase源码及Comparator自定义比较器
    dotnet 使用 ConfigureAwait.Fody 库设置默认的 await 同步上下文切换配置
    dotnet 解析 TTF 字体文件格式
    Total Commander 使用 mklink 建立文件夹链接 将 C 盘文件迁移到其他盘
    dotnet OpenXML 解析 PPT 图表 解析日期时间表示内容
    dotnet 使用 IndentedTextWriter 辅助生成代码时生成带缩进的内容
    dotnet 读 WPF 源代码笔记 为什么自定义的 UserControl 用户控件不能跨程序集继承
    dotnet 使用 TaskTupleAwaiter 同时等待多个任务简化代码写法
    dotnet OpenXML 解析 PPT 图表 面积图入门
  • 原文地址:https://www.cnblogs.com/626498301/p/1798662.html
Copyright © 2020-2023  润新知