WebClient概述
从MSDN中我们可以得知,WebClient的作用就是“Provides common methods for sending data to and receiving data from a resource identified by a URI.”也就是说我们可以通过这个类去访问与获取网络上的资源文件。
WebClient类不能被继承,我们可以通过WebRequest和WebResponse这两个类来处理向URI标示的资源和获取数据了。这两个类功能挺强大的,但不足之处的是利用WebRequest和WebResponse时设置过于复杂,使用起来颇为费劲。而WebClient可以理解为对WebRequest和WebResponse等协作的封装。它使人们使用起来更加简单方便,然后它也有先天不足的地方。那就是缺少对cookies/session的支持,用户无法对是否自动url转向的控制,还有就是缺少对代理服务器的支持等等,不过我们可以通过重写WebClient的一些方法来实现这些功能。

WebClient的函数与基本用法
WebClient提供四种将数据上载到资源的方法:
1.OpenWrite 返回一个用于将数据发送到资源的 Stream。
2.UploadData 将字节数组发送到资源并返回包含任何响应的字节数组。
3.UploadFile 将本地文件发送到资源并返回包含任何响应的字节数组。
4.UploadValues 将 NameValueCollection 发送到资源并返回包含任何响应的字节数组。
另外WebClient还提供三种从资源下载数据的方法:
1.DownloadData 从资源下载数据并返回字节数组。
2.DownloadFile 从资源将数据下载到本地文件。
3.OpenRead 从资源以 Stream 的形式返回数据。
WebClient与其他网络相关类的区别
WebClient和HttpWebRequst是用来获取数据的2种方式,一般而言,WebClient更倾向于“按需下载”,事实上掌握它也是相对容易的,而HttpWebRequst则允许你设置请求头或者对内容需要更多的控制,后者有点类似于form中的submit。虽然两者都是异步请求事件,但是WebClient是基于事件的异步,而HttpWebRequst是基于代理的异步编程。
WebClient使用范例

private void button1_Click(object sender, RoutedEventArgs e){//通过WebClient方式去获取资源文件Uri uri = new Uri("http://localhost:2052/Images/cnblogs.png", UriKind.Absolute);WebClient webClient = new WebClient();webClient.OpenReadAsync(uri);webClient.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;}

WebRequest和WebResponse入门案例

public Form1()
{WebRequest wrq = WebRequest.Create("");
WebResponse wrs = wrq.GetResponse();
Stream strm = wrs.GetResponseStream();
StreamReader sr = new StreamReader(strm);
while ( (line = sr.ReadLine()) != null)
{Console.WriteLine(line);
}
strm.Close();
}

案例分析
WebRequest类是支持不同网络协议的类层次结构的一部分,为了给请求类型接收一个对正确对象的引用,需要一个工厂(factory)机制。WebRequest.Create()方法会为给定的协议创建合适的对象。
WebRequest类代表要给某个URI发送信息的请求,URI作为参数传送给Create()方法。WebResponse类代表从服务器获取的数据。调用WebRequest.GetResponse()方法,实际上是把请求发送给Web服务器,创建一个Response对象,检查返回的数据。
HTTP标题信息
HTTP协议的一个重要方面就是能够利用请求和响应数据流发送扩展的标题信息。标题信息可以包括cookies、以及发送请求的特定浏览器(用户代理)的一些详细信息。
WebRequest类和WebResponse类提供了读取标题信息的一些支持。而两个派生的类HttpWebRequest类和HttpWebResponse类提供了其他HTTP特定的信息。用HTTP URI创建WebRequest会生成一个HttpWebRequest对象实例。因为HttpWebRequest派生自WebRequest,可以在需要WebRequest的任何地方使用新实例。
还可以把实例的类型强制转换为HttpWebRequest引用,访问HTTP协议特定的属性。同样,在使用HTTP时,GetResponse()方法调用会返回WebResponse引用,也可以进行一个简单的强制转换,以访问HTTP特定的特性。

WebRequest wrq = WebRequest.Create("");
HttpWebRequest hwrq = (HttpWebRequest)wrq;
Console.WriteLine("Request Timeout (ms) = " + wrq.Timeout);
Console.WriteLine("Request Keep Alive = " + hwrq.KeepAlive);
Console.WriteLine("Request AllowAutoRedirect = " + hwrq.AllowAutoRedirect);

imeout属性的单位是毫秒,其默认值是100 000。可以设置这个属性,以控制WebRequest对象在产生WebException之前要在响应中等待多长时间。可以检查属性WebException.Status,看看产生异常的原因。这个枚举类型包括超时的状态码、连接失败、协议错误等。
KeepAlive属性是对HTTP协议的特定扩展,所以可以通过HttpWebRequest引用访问这个属性。该属性允许多个请求使用同一个连接,在后续的请求中节省关闭和重新打开连接的时间。其默认值为true。
AllowAutoRedirect属性也是专用于HttpWebRequest类的,使用这个属性可以控制Web请求是否应自动跟随Web服务器上的重定向响应。其默认值也是true。如果只允许有限的重定向,可以把HttpWebRequest的MaximumAutomaticRedirections属性设置为想要的数值。
请求和响应类把大多数重要的标题显示为属性,也可以使用Headers属性本身显示标题的总集合。在GetResponse()方法调用的后面添加如下代码

WebRequest wrq = WebRequest.Create("");
WebResponse wrs = wrq.GetResponse();
WebHeaderCollection whc = wrs.Headers;
for(int i = 0; i < whc.Count; i++)
{Console.WriteLine("Header " + whc.GetKey(i) + " : " + whc[i]);
}

异步页面请求
WebRequest类的另一个特性就是可以异步请求页面。由于在给主机发送请求到接收响应之间有很长的延迟,因此,异步请求页面就显得比较重要。像WebClient.DownloadData()和WebRequest.GetResponse()等方法,在响应没有从服务器回来之前,是不会返回的。
如果不希望在那段时间中应用程序处于等待状态,可以使用BeginGetResponse() 方法和 EndGetResponse()方法,BeginGetResponse()方法可以异步工作,并立即返回。在底层,运行库会异步管理一个后台线程,从服务器上接收响应。
BeginGetResponse() 方法不返回WebResponse对象,而是返回一个执行IAsyncResult接口的对象。使用这个接口可以选择或等待可用的响应,然后调用EndGetResponse()搜集结果。
也可以把一个回调委托发送给BeginGetResponse()方法。该回调委托的目的地是一个返回类型为void并把IAsyncResult引用作为参数的方法,当工作线程完成了搜集响应的任务后,运行库就调用该回调委托,通知用户工作已完成。如下面的代码所示,在回调方法中调用EndGetResponse()可以接收WebResponse对象:

public Form1()
{InitializeComponent();
WebRequest wrq = WebRequest.Create("");
wrq.BeginGetResponse(new AsyncCallback(OnResponse), wrq);
}
protected void OnResponse(IAsyncResult ar)
{WebRequest wrq = (WebRequest)ar.AsyncState;
WebResponse wrs = wrq.EndGetResponse(ar);
// read the response ...
}

实用工具类-URI
Uri和UriBuilder是System命名空间下的两个类。UriBuilder可以通过给定的字符串,从而构建一个URI,而Uri类可以分析,组合和比较URI。
1,创建Uri类

Uri uri = new Uri("http://www.microsoft.com/somefolder/somefile.htm?order=true");

2,分析Uri取得一些属性

string query = uri.Query;// ?order=true 得到参数部分string absPath = uri.AbsolutePath; //   /somefoler/somefile.htm 得到路径部分string scheme = uri.Scheme; // http 得到协议int port = uri.Port ; // 80 访问端口string host = uri.Host;    // www.microsoft.combool isDefaultPort = uri.IsDefaultPort;

实用工具类-UriBuilder

UriBuilder builder = new UriBuilder("http","www.microsoft.com",80,"somefolder/somefile.htm");
也可以单独给每个属性部分赋值builder.Scheme = "http";builder.Host="www.microsoft.com";builder.Port = 80;builder.Path="somefolder/somefile.htm";//通过builder构建uri
Uri completeUri = builder.Uri;

实用工具类-IPAddress

创建IP地址IPAddress ipAddress = IPAddress.Parse("234.34.5.3");byte[] address = ipAddress.GetAddressBytes();//得到四个位置上的具体值string ipString = ipAddress.ToString();//得到ip的字符串

实用工具类-Dns和IPHostEntry

IPHostEntry ipentry = Dns.Resolve("www.baidu.com");
IPHostEntry ipentry = Dns.GetHostByAddress("23.34.3.43");通过域名或者ip地址获取主机信息

WebClient概述相关推荐

  1. 一步一步学Silverlight 2系列(12):数据与通信之WebClient

    版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://terrylee.blog.51cto.com/342737/67249 ...

  2. SAP 产品 UI 里的容器组件的概念和开发概述

    这是 Jerry 2021 年的第 68 篇文章,也是汪子熙公众号总共第 345 篇原创文章. Jerry 之前的文章,谈谈 SAP 产品 UI 开发中的组件概念,曾经提到,无论基于何等开发技术的 S ...

  3. 基于事件的异步模式概述

    基于事件的异步模式概述 MSDN 那些同时执行多项任务.但仍能响应用户交互的应用程序通常需要实施一种使用多线程的设计方案.System.Threading 命名空间提供了创建高性能多线程应用程序所必需 ...

  4. Spring官网学习(一)概述

    文章目录 1.Spring官网简介 2.Spring总览 2.1.什么是Spring 2.2.Spring的发展历程 3.Spring的设计理念 3.1.Spring的优点 4.IOC和AOP浅析 4 ...

  5. CGB2005 JT-1(jt概述 SqlYog 物理模型图PD 表结构 pom文件标签说明 jt环境搭建 创建项目2种,创建各种文件 idea导入,打包,删除项目,启动原理)

    注意事项: 1.京淘项目概述和动吧项目缺点描述 2.把sql文件导入数据库:通过SqlYog可视化工具或者Dos命令窗口. 3.SqlYog说明,和制作物理模型图的工具pd用发. 4.表结构学习 5. ...

  6. Java 多线程概述

    多线程技术概述 1.线程与进程 进程:内存中运行的应用程序,每个进程都拥有一个独立的内存空间. 线程:是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换.并发执行,一个进程最少有一个线程, ...

  7. 【SpringMVC】概述

    概述: SpringMVC:是基于spring的一个框架, 实际上就是spring的一个模块, 专门是做web开发的.                       理解是servlet的一个升级 Sp ...

  8. 梯度下降优化算法概述

    本文原文是 An overview of gradient descent optimization algorithms,同时作者也在 arXiv 上发了一篇同样内容的 论文. 本文结合了两者来翻译 ...

  9. Redis概述和基础

    Redis 1.NoSQL NoSQL = Not Only SQL(不仅仅是SQL) 泛指非关系型数据库的,随着web2.0互联网的诞生!传统的关系型数据库很难对付web2.0时代!尤其是超大规模的 ...

最新文章

  1. 字符串移位:如“abcdefghi”右移2位后变成“cdefghiab”
  2. getAffineTransform函数
  3. Leetcode5634. 删除子字符串的最大得分[C++题解]:贪心
  4. 网易云课堂计算机体系,计算机系统结构 (三) CPU及其结构分析
  5. VTK:平行坐标用法实战
  6. Sangmado 公共基础类库
  7. ssh解决root_unlock_time问题
  8. SQL ---- 查询字段为逗号拼接的字符串
  9. 小码农也有大梦想!最小公倍数java算法
  10. [导入]关于:web.config 的配置说明
  11. 敏捷思维- 架构设计中的方法学(1)
  12. python数据分析与应用-Python数据分析与应用 PDF 内部全资料版
  13. 硬盘的老化测试软件,扩容卡检测、扩容U盘检测工具(MyDiskTest)
  14. 破解sublime 3207(2019.6.3更新)
  15. Windows使用Hashcat
  16. 802.1Q VLAN 简介
  17. Everyone Do this at the Beginning!!--kaggle数据预处理-超详细的解说
  18. map组件如何展示marker的callout气泡
  19. 透明显示屏(隐形显示屏)简述
  20. RE:从零开始的算法之路第六章

热门文章

  1. 思维的技术:如何破解工作生活中的两难冲突?
  2. cac会议投稿难度大吗_【CAC2018】2018中国自动化大会论文及注册相关问题答复(QA)...
  3. Nginx --高阶
  4. linux系统下的动态壁纸,Ubuntu 10.04下实现动态桌面壁纸
  5. 一个屌丝程序猿的人生(一百一十)
  6. H5唤醒本地APP(谷歌地图、百度地图等相通)传递数据
  7. 热插拔能力,热交换,热冗余
  8. CNCC 2016 | 南京大学黄宜华教授 50 张 PPT 剖析 Alluxio 及其应用
  9. centos7.2 搭建BugFree
  10. 云南烟草:科技引领财务变革 智能创造财务价值