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;

转载于:https://www.cnblogs.com/626498301/archive/2010/08/13/1798662.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380944.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

连接字符串

方式一&#xff1a;可以使用运算符**“”**来连接字符串 public class StringBufferReview {/*** 方式一&#xff1a;使用连接* param args*/public static void main(String[] args) {String s1 "hello";String s2 "Java";String s3 s1s2;System.out.…

的使用_面部精华使用方法和使用步骤;

核心提示&#xff1a;精华液&#xff0c;是护肤品中之极品&#xff0c;成分精致、功效强大、效果显著&#xff0c;始终保持着它拥有的高贵和神秘。精华液中的基质是水&#xff0c;含有硅树脂&#xff0c;有利于渗透进皮肤和推开&#xff0c;其它添加成分&#xff0c;则带有治疗…

处理字符串中的单个字符CharAt()

1、解决方法&#xff1a;采用循环以及String类的charAt()方法 charAt()方法将返回String对象中索引值**&#xff08;从0开始&#xff09;**位置的字符。所以&#xff0c;我们只需要执行从0到String.length()-1的循环&#xff0c;就能够依次处理字符串中的所有字符。 注意&#…

Acer Travelmate T3290笔记本拆机指南

中午闲来无事&#xff0c;把永哥的笔记本拆了&#xff08;Acer Travelmate某款&#xff0c;很老的机器了&#xff09;。整个过程有惊无险&#xff0c;也没拍照片&#xff0c;大体说下拆机流程吧&#xff0c;如果有人要拆该系笔记本可以参考。 先卸电池。拿掉诸如读卡器盖&#…

解决VS2013中出现类似于error C4996: 'scanf': This function or variable may be unsafe的安全检查错误

禁用安全检查&#xff0c;一步到位&#xff01; 参考URL&#xff1a;https://blog.csdn.net/dan15188387481/article/details/49622783

横向全屏滑动插件_【案例】JQuery横向手风琴图片轮播切换代码

点击上方[我分享我快乐]→[...]右上角→[设为星标⭐]即可第一时间获取最新设计资源哈喽大家好&#xff0c;又到了每周二经典案例环节啦~同学们还想了解哪些网页知识今天段老师给同学们带来的是JQuery横向手风琴图片轮播切换代码。01脚本简介jQuery实现水平手风琴图片轮播切换特…

将字符串全部转为大写或者小写

1、全部转大写&#xff0c;使用toUpperCase()方法&#xff1b;全部转小写&#xff0c;使用toLowerCase()方法 public class StringUpperAndLowerReview {public static void main(String[] args) {String s "Hello jaVa";System.out.println(s.toUpperCase());Syst…

是网关吗_什么是边缘控制器?就是IPC+PLC+网关吗?今天就拆开一个来看看

边缘计算作为云计算的一项重要补充&#xff0c;在构建互联工厂中的作用正越来越受到重视。边缘计算实现了数据在网络边缘侧的分析、处理与储存&#xff0c;不仅减少了对云端依赖&#xff0c;也提高了数据的安全性。不管是因为云计算本身&#xff0c;还是网络传输受限&#xff0…

删除字符串的前置或者后置空格

解决方法&#xff1a;String类的trim()方法提供了此功能&#xff0c;trim()方法可以删除个行开头的空格和TAB符 public class TrimReview {public static void main(String[] args) {String s " xxxx ";System.out.println(s.trim());} }结果&#xff1a;

基于Windows 7旗舰版搭建WinCE6.0开发环境的过程

首先感谢JeffreyLi提供了更简便的安装WinCE6.0 R3的方法&#xff0c;今天验证过了&#xff0c;确实比我之前整理的《WinCE6.0 R3的安装步骤》方便很多&#xff0c;十分感谢&#xff01; 为了方便大家参考&#xff0c;重新整理的安装步骤如下&#xff1a; *Please install the …

随机邮箱_msgsafe - 一个处于半死不活状态的加密邮箱

一个半死不活的、还算有点意思的、支持端到端加密的免费邮箱&#xff0c;目前看来。邮箱简介好像自从Protonmail火了之后&#xff0c;支持端到端加密的邮箱越来越多&#xff0c;但大多有一个共同点&#xff1a;后缀都不怎么样。msgsafe.io于2016年建立&#xff0c;当年为了推广…

Spring环境搭建

1、导包&#xff08;此处省略如何下载Spring文件&#xff09; 打开我们的spring-framework-4.2.3.RELEASE文件&#xff08;这里我们只导入最基础的几个包&#xff09;&#xff0c;再打开libs文件&#xff1a; 找到以下几个包&#xff1a; 复制粘贴到eclipse中去&#xff0c;如…

win下python2,3和pip2,3双版本共存

在python环境中&#xff0c;有些开发需要依赖于python3的安装包&#xff0c;然而有些又需要python2才能运行。索性将python2和python3同时安装&#xff0c;并配置好各自的运行方式&#xff0c;以及各版本的pip。方便在需要安装工具包的时候&#xff0c;能准确定位到相应的版本。…

h5分享到朋友圈_微信朋友圈创意招聘广告制作方法 H5模板

微信朋友圈招聘广告发布出去那么久了&#xff0c;为啥还是没有求职者前来应聘呢&#xff1f;那么一定是你的招聘广告不够创意&#xff0c;所以没能吸引求职者的目光。如何才能制作一个有创意更吸引求职者眼球的招聘广告呢&#xff1f;现在你只需通过制作平台的一个模板&#xf…

还原特别慢_正手攻球最容易忽略的一步——还原

你距离标准的正手攻球可能只差一步。许多朋友在练习正手攻球一段时间以后&#xff0c;动作框架基本形成&#xff0c;有蹬转&#xff0c;能发力&#xff0c;肩部大臂都能放松&#xff0c;甚至能在击球的瞬间可以用上手指手腕的力量。但是录完视频一看&#xff0c;好像总是差那么…

Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)

Ubuntu使用教程&#xff1a;E: 无法获得锁 /var/lib/apt/lists/lock - open (11 资源临时不可用) 查看一下是否有使用apt-get的程序,终端输入:ps -aux,找到使用apt-get的程序(最后一列),查看其PID号,然后杀死其进程,输入sudo kill PID. 用sudo apt-get update时出现“ E: 无法…

Spring三种对象创建方式

1、创建方式1&#xff1a;无参构造 我们先创建一个User类&#xff1a; public class User {private String name;private int age;public User() {System.out.println("无参构造方法");}public String getName() {return name;}public void setName(String name) {t…

unity中链接字符串和变量显示_理解Unity中的优化(六):字符串和文本

字符串和文本&#xff1a;在Unity项目中&#xff0c;处理字符串和文本经常会产生性能问题。在C#中&#xff0c;字符串是不变的。任何对字符串的操作都会重新分配新的字符串&#xff0c;这个代价是非常昂贵的。如果在多重循环中重复地执行字符串连接操作&#xff0c;就会造成性能…

Bean的scope属性

1、singleton&#xff08;默认值&#xff09;&#xff1a;单列对象&#xff0c;被标识为单例的对象在spring容器中只会存在一个实例 测试如下&#xff1a; 我们创建一个User类&#xff1a; public class User {private String name;private int age;public User() {System.out…

Oracle 索引扫描的五种类型

之前在讨论CBO和RBO的时候提到了索引扫描的几种类型。 Oracle Optimizer CBO RBO http://blog.csdn.net/tianlesoftware/archive/2010/08/19/5824886.aspx Oracle 索引 详解 http://blog.csdn.net/tianlesoftware/archive/2010/03/05/5347098.aspx Oracle Explain Plan http:/…