WebClient

HttpWebRequest

//HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(urlAddress);
            //HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
            //Stream stream = webResponse.GetResponseStream();
            //StreamReader reader = new StreamReader(stream, System.Text.Encoding.GetEncoding("UTF-8"));
            //string s = reader.ReadToEnd();
          
            //Uri endpoint = new Uri(urlAddress);
            //WebClient client = new WebClient();
            //client.Encoding = Encoding.UTF8;
            //byte[] bytes = client.DownloadData(endpoint);
            //string s = System.Text.Encoding.UTF8.GetString(bytes);

Mircsoft在dotnet1.1框架下提供的向 URI 标识的资源发送数据和从 URI 标识的资源接收数据的公共方法。 通过这个类,大家可以在脱离浏览器的基础上模拟浏览器对互联网上的资源的访问和发送信息。     WebClient类不能被继承,在dotnet1.1框架中已经为我们提供了WebRequest和WebResponse两个强大的类来 处理向URI标示的资源和获取数据了。然后,不足的是利用WebRequest和WebResponse时设置过于复杂。 使用起来颇为费劲。于是乎有了现在的WebClient,WebClient其实可以理解为对WebRequest和WebResponse等 协作的封装。它使人们使用起来更加简单方便,然后它也有先天不足的地方。那就是缺少对cookies/session的 支持,用户无法对是否自动url转向的控制,还有就是缺少对代理服务器的支持。关于session/url转向控制/代理 服务器的使用我将在以后关于WebRequest/WebResponse的话题里面向大家介绍。下面先给大家简单介绍一 下WebClinet类。   类名:WebClient   命名空间System.Net.WebClient

公共构造函数

WebClient 构造函数 初始化 WebClient 类的新实例。

公共属性

BaseAddress 获取或设置 WebClient 发出请求的基 URI。
Container(从 Component 继承) 获取 IContainer,它包含 Component
Credentials 获取或设置用于对向 Internet 资源的请求进行身份验证的网络凭据。
Headers 获取或设置与请求关联的标头名称/值对集合。
QueryString 获取或设置与请求关联的查询名称/值对集合。
ResponseHeaders 获取与响应关联的标头名称/值对集合。
Site(从 Component 继承) 获取或设置 ComponentISite

公共方法

CreateObjRef(从 MarshalByRefObject 继承) 创建一个对象,该对象包含生成用于与远程对象进行通讯的代理所需的全部相关信息。
Dispose(从 Component 继承) 已重载。释放由 Component 占用的资源。
DownloadData 从具有指定 URI 的资源下载数据。
DownloadFile 从具有指定 URI 的资源将数据下载到本地文件。
Equals(从 Object 继承) 已重载。确定两个 Object 实例是否相等。
GetHashCode(从 Object 继承) 用作特定类型的哈希函数,适合在哈希算法和数据结构(如哈希表)中使用。
GetLifetimeService(从 MarshalByRefObject 继承) 检索控制此实例的生存期策略的当前生存期服务对象。
GetType(从 Object 继承) 获取当前实例的 Type
InitializeLifetimeService(从 MarshalByRefObject 继承) 获取控制此实例的生存期策略的生存期服务对象。
OpenRead 为从具有指定 URI 的资源下载的数据打开一个可读的流。
OpenWrite 已重载。打开一个流以将数据写入具有指定 URI 的资源。
ToString(从 Object 继承) 返回表示当前 ObjectString
UploadData 已重载。将数据缓冲区上载到具有指定 URI 的资源。
UploadFile 已重载。将本地文件上载到具有指定 URI 的资源。
UploadValues 已重载。将名称/值集合上载到具有指定 URI 的资源。

从上表中我们可以看到WebClient提供四种将数据上载到资源的方法:

  • OpenWrite 返回一个用于将数据发送到资源的 Stream
  • UploadData 将字节数组发送到资源并返回包含任何响应的字节数组。
  • UploadFile 将本地文件发送到资源并返回包含任何响应的字节数组。
  • UploadValuesNameValueCollection 发送到资源并返回包含任何响应的字节数组。

另外WebClient还提供三种从资源下载数据的方法:

下面我们将通过一个简单的应用程序来测试WebClient的最简单用法作为本小节的结束让大家对WebClient有个初步的认识       例子1:利用WebClient实现对博客园首页的访问         首先我们用HttpLook对这次访问进行分析,为了方便分析我特别将浏览器对图片的访问去掉 让我们能看到更简便的分析结果           我们可以看到整个过程中我们发起了4次资源请求,其中第一次是对博客园首页进行访问      第二次访问的是样式表文件,第三和四次访问的是js脚本。      我们点击第一项可以看见关于这次资源访问的http头部信息,所谓http头部就是我们不能看见的浏览器和远程服务器传递的一些不可见元素。

Cookie: .DottextCookie=(隐藏)

这些http信息包含了浏览器访问的过程。其中   第一行:请求地址的相对路径和使用协议 相对路径为/ 协议采用http1.1   第二行:表示我们请求的资源种类。   第三行:我们的语言是简体中文。   第四行:我们使用的cup结构。这个http头在一般的网页中并不过见。估计是博客园的一次调查??   第五行:标示采用gzip方式压缩html编码进行传递。只有一些浏览器支持的gzip解压缩时采用这种方式传递文本。由于我们   要写的程序不具备gzi解压缩的能力 所以我们不考虑使用这种方式发送请求。   第六行:浏览器说明   第七行:当前主机地址   第八行:连接请求状态   第九行:cookies信息     我在新建的应用程序里面利用WebClient来实现这了一过程。      下面我将就关键实现做一些解释

            textBox1.Text=_read.ReadToEnd();

第一行:新建一个WebClient 实例_client   第二行~第七行:将上边捕捉到的Http头部放入到_client实例,注意第六行的被注释掉了。因为我们的程序无法进行gzip解码所以如果这样请求   获得的资源可能无法解码。当然我们可以给程序加入gzip处理的模块 那是题外话了。   第八行:利用_client.OpenRead(string URI)的方法获取网上资源的Stream   第九行:利用StreamReader将Stream用我们需要的编码方法去解析。这里使用了UTF8。对应不同的网站可以使用Default等不同的解码方法。   第十行:将我们解码后的内容放到textBox1里面显示出来   好了 大致关于WebClient的介绍就到这里了。以后将为大家陆续介绍WebClient的各种属性和方法。   利用WebClient做个资源小偷其实是很简单的,所以大家一定要防盗链阿!!!

这两天,遇到了一个winform联网获取数据的问题,于是从网上搜了些资料学习了一下,完了之后,也不能忘记总结。下面我就简单谈一下WebClient类的常见用法。

 
首先,我先谈一下我对WebClient类中这些方法的操作方式的看法。我想,很多人可能跟我一样,觉得MSDN对这个类的很多解释和案例都让人看起来觉得蛋疼,因为,解释的比较含糊(或者说比较官方),举得例子吧,也太简单了,并且,只有客户端的代码,没有服务器端的代码。这些东西都让人觉得WebClient这种操作方式挺神秘的。其实,真的没有什么神秘的。服务器端,就是一个网页(这个就是让人不知为何物的CRI资源),这个网页就跟一般的网页只有一点不一样,就是,如果需要向客户端返回数据的话,用Response.write()方法输出,这样子就能被客户端获取到了。至于为什么能被客户端获取到,那我就不晓得了,这个问题得去问微软。客户端的代码,比较简单无非就是字符串啊,流啊,等。两种提交的方式有必要说一下,一种是同步,一种是异步。
这种方式,比较适合于桌面软件联网访问数据库。其实,是桌面软件访问某个你做好的页面,把某些参数传到那个页面中,然后,你在那个网页中,根据传递过来的参数,把某些跟数据库有关的业务逻辑处理一下,然后再返回客户端。
下面,我贴出来一些代码,以便更好地理解WebClient。
 
功能一:
向服务器提交数据:
 
客户端代码:
    private void btn_sent_Click(object sender, EventArgs e)
        {
           string data = this.textBox1.Text.ToString();
 
            Uri endpoint = new Uri("http://localhost:3778/Default2.aspx");//这个你可以根据自己的本地端口修改
 
            WebClient client = new WebClient();
            client.Encoding = Encoding.UTF8;
            //这是一种异步执行的方法,当数据下载完之后,会触发UploadStringCompleted 事件,
            //   所以,我们注册这个事件
            client.UploadStringCompleted +=
            new UploadStringCompletedEventHandler(client_UploadStringCompleted);
            client.UploadStringAsync(endpoint, "POST", data);
      }
        /// <summary>
        /// 下载完数据之后,就会调用这个方法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
     void client_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
        {
            MessageBox.Show(e.Result);
        }
 
 
 
服务器端代码:
 
 
    protected void Page_Load(object sender, EventArgs e)
        {
            //获取从客户端传来的信息 
            int length = Request.ContentLength;
            byte[] bytes = Request.BinaryRead(length);
 
            string txtContent =System.Text.Encoding.UTF8.GetString(bytes);
          
            //服务器在这里可以完成业务逻辑。举个例子,如果从客户端传过来一条SQL语句,
            //那么,在这里就可以执行这条Sql语句。
          
            //从服务器端返回信息 
            Response.ContentType = "text/plain";
            Response.Write(txtContent);
        }
 
 
 
 
功能二:根据某些参数,从服务器检索数据,并接受该数据
 
客户端代码:
             string tranType = "TextStr";//第一个参数
             sting tranType="weather"; //第二个参数。这两个参数可以根据具体的逻辑改写
            Uri endpoint = new Uri(String.Format("http://localhost:3778/Default.aspx?infoType=  
            {0}&tranType={1}", infoType, tranType));
            WebClient client = new WebClient();
            client.Encoding = Encoding.UTF8;         
            client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);
 
            client.DownloadStringAsync(endpoint);
 
 
void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            string RetStr = "";
            if (e.Error == null)
            {
                //RetStr = "WebClient成功通讯";
                RetStr = e.Result;   
          }
            else
            {
                RetStr = e.Error.Message;
            }
            MessageBox.Show( RetStr);  //显示操作结果信息
 
        }
 
 
服务器端代码:
 
     protected void Page_Load(object sender, EventArgs e)
        {
            //读取从客户端传递过来的参数 
            string infoTypeStr = Request.QueryString["infoType"];
            string tranTypeStr = Request.QueryString["tranType"];
            //根据参数,做一些相应的业务逻辑
            string  retValueStr  ="处理逻辑后的返回结果";
            Response.ContentType = "text/plain";
            Response.Write(retValueStr);
        }
 
 
这两个功能,请参考http://blog.csdn.net/longlong821/article/details/7187524 。
 
功能三:想服务器上传文件
这个思想就是把文件转换成流的形式,然后发送到服务器端。
客户端代码:
 
WebClient client = new WebClient();
 
sting uriString="http://localhost:3778/Default2.aspx";
string fileName="D:\\1.txt"; //你要给些这个文件路径
myWebClient.UploadFile(uriString, fileName);
 
 
服务器端:
private void Page_Load(object sender, System.EventArgs e) {   // 获取 http提交上传的文件, 并改名保存      foreach (string key in Request.Files.AllKeys)       {          HttpPostedFile file = Request.Files[key];          string newFilename = DateTime.Now.ToString("yyMMddhhmmssffff")                 + file.FileName.Substring(file.FileName.LastIndexOf('.'));             try             {   //文件保存并返回相对路径地址                file.SaveAs(this.serverPath + newFilename);                 Response.Write("upload/" + newFilename);             }             catch (Exception)             {                             }         }     }
 
上传文件部分请参见 http://www.blogjava.net/kiant/articles/277929.html 。

WebClient HttpWebRequest从网页中获取请求数据的更多相关文章

  1. 【在网页中获取截图数据】Chrome和Firefox下的实战经验

    [转载自我在segmentfault的专栏:https://segmentfault.com/a/1190000004584071] 最近在实现一个功能,需求如下: 前提:当前页面无弹窗 页面任意位置 ...

  2. yii学习笔记(4),获取请求数据的request组件

    yii在控制器中获取请求数据需要通过request组件来完成 <?php namespace app\controllers; use yii; use yii\web\Controller; ...

  3. 使用Xpath从网页中获取数据

    /// <summary> /// 从官方网站中抓取产品信息存放在本地数据库中 /// </summary> /// <returns></returns&g ...

  4. 浅谈如何使用python抓取网页中的动态数据

    我们经常会发现网页中的许多数据并不是写死在HTML中的,而是通过js动态载入的.所以也就引出了什么是动态数据的概念, 动态数据在这里指的是网页中由Javascript动态生成的页面内容,是在页面加载到 ...

  5. web过滤器中获取请求的参数(content-type:multipart/form-data)

    1.前言: 1.1 在使用springMVC中,需要在过滤器中获取请求中的参数token,根据token判断请求是否合法: 1.2 通过requst.getParameter(key)方法获得参数值; ...

  6. 解决网页中Waiting (TTFB)数据加载过慢的问题

    解决网页中Waiting (TTFB)数据加载过慢的问题 最近做了一个网页,在本地测试良好,数据可以得到很快的反馈,但是当部署到云端Linux上时候,就会出现加载缓慢的问题.本地测试,得到数据大概3s ...

  7. angular开发中对请求数据层的封装

    代码地址如下:http://www.demodashi.com/demo/11481.html 一.本章节仅仅是对angular4项目开发中数据请求封装到model中 仅仅是在项目angular4项目 ...

  8. python抓取网页中的动态数据

    一.概念 网页中的许多数据并不是写死在HTML中的,而是通过js动态载入的.所以也就引出了什么是动态数据的概念,动态数据在这里指的是网页中由Javascript动态生成的页面内容,是在页面加载到浏览器 ...

  9. SpringBoot web获取请求数据【转】

    SpringBoot web获取请求数据 一个网站最基本的功能就是匹配请求,获取请求数据,处理请求(业务处理),请求响应,我们今天来看SpringBoot中怎么获取请求数据. 文章包含的内容如下: 获 ...

随机推荐

  1. Reference Counting GC (Part one)

    目录 引用计数法 计数器值的增减 new_obj()和update_ptr()函数 new_obj()生成对象 update_ptr()更新指针ptr,对计数器进行增减 优点 可即可回收垃圾 最大暂停 ...

  2. Swift学习笔记(11)--类与结构体

    类与结构是编程人员在代码中会经常用到的代码块.在类与结构中可以像定义常量,变量和函数一样,定义相关的属性和方法以此来实现各种功能. 和其它的编程语言不太相同的是,Swift不需要单独创建接口或者实现文 ...

  3. 怎样更好的设计android图标,拉伸不变形等等系列长处,并且减小apk大小

    android mvp框架:dileber(https://github.com/dileber/dileber.git) 继续为大家介绍android mvp开源框架 dileber  今天主要是字 ...

  4. win7中下mysql-5.6.22免安装配置

    windows下mysql免安装配置 1. 下载mysql免安装压缩包 下载mysql-5.6.22-winx64.zip 解压到本地D:\mysql-5.6.22-winx64 2. 修改配置文件 ...

  5. js---11运算符,流程控制,真假

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  6. vue -- config.js 配置跨域文件

    1.在使用vue开发的时候经常要涉及到跨域的问题,其实在vue cli中是有我们设置跨域请求的文件的. 2.当跨域无法请求的时候我们可以修改工程下config文件夹下的index.js中的dev -- ...

  7. 程序中为什么会使用while(0)

    https://blog.csdn.net/u012062760/article/details/46446207 关于while(0)实际上是用来宏定义的,这样的宏定义可以避免调用的时候出错. 如下 ...

  8. 【例题 8-15 UVA - 12174】Shuffle

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举第一段的范围[0..i] (0<=i<s) 然后看看[i+1..i+s-1],[i+s,i+s+s-1]..这些区间 ...

  9. SQL优化工具SQLAdvisor使用(转)

    一.简介 在数据库运维过程中,优化SQL是业务团队与DBA团队的日常任务.例行SQL优化,不仅可以提升程序性能,还能够降低线上故障的概率. 目前常用的SQL优化方式包括但不限于:业务层优化.SQL逻辑 ...

  10. 洛谷 P2392 kkksc03考前临时抱佛脚

    P2392 kkksc03考前临时抱佛脚 题目背景 kkksc03的大学生活非常的颓废,平时根本不学习.但是,临近期末考试,他必须要开始抱佛脚,以求不挂科. 题目描述 这次期末考试,kkksc03需要 ...