用WebClient类简单实现网上下载和上传数据,小偷程序
分类:web前端

  
在.Net 平台下,创建一个ASP.Net的程序
1、引用两个NAMESPACE
      using System.Text     //因为用了Encoding类
      using System.Net      //因为用了WebClient 类
2、整个程序用了三个控件
      txtUrl    //输入你要获取的网页地址 TEXTBOX控件
      txtBody  //得到你要获取的网页内容 TEXTBOX控件
      btnReturn  //按钮BUTTON控件
3、在***.aspx.cs下的代码
private void btnReturn_Click(object sender, System.EventArgs e)
  {
    string url=txtUrl.Text.Trim(,',',');    //获取输入的网页地址

.Net2.0中新增了很多组件,WebClient就是其中一个,功能也很强大,今天拿WebClient做了一个小实验,只用到了一些很简单的功能就可以实现以前不好实现的功能,很方便。

有时候,处于程序的需要,程序要求动态的从网络上更新数据,最常见的比如从数据中心下载或上传企业内部数据或者资料;有时候,想做一些类似机器人的工作,让程序自动获取IntraNet亦或InterNet上的资源,可能是新闻、图片、以及你想得到的……这个时候就需要编一些小程序。

    WebClient wb=new WebClient(,',',');  //创建一个WebClient实例
    //获取或设置用于对向 Internet 资源的请求进行身份验证的网络凭据。(可有可无)
    //wb.Credentials=CredentialCache.DefaultCredentials; 
    //从资源下载数据并返回字节数组。(加@是因为网址中间有"/"符号)
    byte[] pagedata=wb.DownloadData(@url,',',');
     //转换字符、
    string result=Encoding.Default.GetString(pagedata,',',');

    简单介绍一下WebClient:
    WebClient 类提供向 URI 标识的任何本地、Intranet 或 Internet 资源发送数据以及从这些资源接收数据的公共方法。
    WebClient 类使用 WebRequest 类提供对资源的访问。WebClient 实例可以通过任何已向 WebRequest.RegisterPrefix 方法注册的 WebRequest 子代访问数据。
    注意
    默认情况下,.NET Framework 支持以 http:、https:、ftp:、和 file: 方案标识符开头的 URI。 

今天我主要介绍一下在.NET中如何获取网络上的数据,当然可以是局域网,甚至Local 文件系统。利用WebClient类,易如反掌!

    txtBody.Text=result; 
  }
4、字***.aspx的HTML代码中加入一条代码
     在第一行代码 中加入validateRequest=false
总结:整个代码不过才几行,而且还不用操心乱码的事情,我是昨天自己在帮助文档里偶然看见的,其实WebClient类有很多下载资源和上载资源的方法,有兴趣的朋友可以看看下面有关WebClient类的帮助文档:
WebClient 类请参见
WebClient 成员 | System.Net 命名空间 | WebRequest | WebResponse | HttpWebRequest | 
HttpWebResponse | WebClient 成员(Visual J# 语法) | C++ 托管扩展编程 
要求
命名空间: System.Net
平台: Windows 98, Windows NT 4.0, Windows ME, Windows 2000, Windows XP Home Edition, Windows XP 
Professional, Windows Server 2003 系列
程序集: System (在 System.dll 中)
.NET Framework 安全性:  
WebPermission,用于访问所请求的 URI 或请求被重定向到的任何 URI。关联的枚举:Connect。 
语言
C#
C++
JScript
Visual Basic
全部显示
提供向 URI 标识的资源发送数据和从 URI 标识的资源接收数据的公共方法。不能继承此类。
有关此类型所有成员的列表,请参阅 WebClient 成员。
System.Object
   System.MarshalByRefObject
      System.ComponentModel.Component
         System.Net.WebClient
[Visual Basic]

    下面描述用于将数据上载到资源的 WebClient 方法: 
    OpenWrite  检索一个用于将数据发送到资源的 Stream。
    OpenWriteAsync  检索 Stream,它在不阻止调用线程的情况下将数据发送到资源。
    UploadData  将字节数组发送到资源,并返回包含任何响应的 Byte 数组。
    UploadDataAsync  在不阻止调用线程的情况下,将 Byte 数组发送到资源。
    UploadFile  将本地文件发送到资源,并返回包含任何响应的 Byte 数组。
    UploadFileAsync  在不阻止调用线程的情况下,将本地文件发送到资源。
    UploadValues  将 NameValueCollection 发送到资源,并返回包含任何响应的 Byte 数组。
    UploadValuesAsync  在不阻止调用线程的情况下,将 NameValueCollection 发送到资源,并返回包含任何响应的 Byte 数组。
    UploadString  在不阻止调用线程的情况下,将 String 发送到资源。
    UploadStringAsync  在不阻止调用线程的情况下,将 String 发送到资源。 

关于WebClient:

NotInheritable Public Class WebClient
   Inherits Component
[C#]
[ComVisible(true)]
public sealed class WebClient : Component
[C++]
[ComVisible(true)]
public __gc __sealed class WebClient : public Component
[JScript]
public
   ComVisible(true)
class WebClient extends Component
线程安全
此类型的所有公共静态(Visual Basic 中为 Shared)成员对多线程操作而言都是安全的。但不保证任何实例
成员是线程安全的。
备注
WebClient 类提供向 URI 标识的任何本地、Intranet 或 Internet 资源发送数据以及从这些资源接收数据的
公共方法。
WebClient 类使用 WebRequest 类提供对 Internet 资源的访问。WebClient 实例可以通过任何已向 
WebRequest.RegisterPrefix 方法注册的 WebRequest 子代访问数据。
注意   默认情况下,.NET Framework 支持以 http:、https: 和 file: 方案标识符开头的 URI。
WebClient 类提供四种将数据上载到资源的方法: 
OpenWrite 返回一个用于将数据发送到资源的 Stream。 
UploadData 将字节数组发送到资源并返回包含任何响应的字节数组。 
UploadFile 将本地文件发送到资源并返回包含任何响应的字节数组。 
UploadValues 将 NameValueCollection 发送到资源并返回包含任何响应的字节数组。 
WebClient 类还提供三种从资源下载数据的方法: 
DownloadData 从资源下载数据并返回字节数组。 
DownloadFile 从资源将数据下载到本地文件。 
OpenRead 从资源以 Stream 的形式返回数据。 
要求
命名空间: System.Net
平台: Windows 98, Windows NT 4.0, Windows ME, Windows 2000, Windows XP Home Edition, Windows XP 
Professional, Windows Server 2003 系列
程序集: System (在 System.dll 中)
.NET Framework 安全性:  
WebPermission,用于访问所请求的 URI 或请求被重定向到的任何 URI。关联的枚举:Connect。 

    下面描述从资源下载数据的 WebClient 方法: 
    OpenRead  从资源以 Stream 的形式返回数据。
    OpenReadAsync  在不阻止调用线程的情况下,从资源返回数据。
    DownloadData 从资源下载数据并返回 Byte 数组。
    DownloadDataAsync  在不阻止调用线程的情况下,从资源下载数据并返回 Byte 数组。
    DownloadFile  从资源将数据下载到本地文件。
    DownloadFileAsync  在不阻止调用线程的情况下,将数据从资源下载到本地文件。
    DownloadString  从资源下载 String 并返回 String。
    DownloadStringAsync  在不阻止调用线程的情况下,从资源下载 String。 

在MSDN中,这样描述WebClient类:

    您可以使用 CancelAsync 方法取消尚未完成的异步操作。
    默认情况下,WebClient 实例不发送可选的 HTTP 报头。如果您的请求需要可选报头,必须将该报头添加到 Headers 集合。例如,要在响应中保留查询,必须添加用户代理报头。此外,如果用户代理标头丢失,服务器可能返回 500(内部服务器错误)。
    在 WebClient 实例中,AllowAutoRedirect 设置为 true。
    给继承者的说明 派生类应调用 WebClient 的基类实现,以确保派生类按预期方式工作。

“提供向 URI 标识的资源发送数据和从 URI 标识的资源接收数据的公共方法”, 默认情况下,.NET 框架支持以 http:、https: 和 file: 方案标识符开头的 URI。是不是封装了很多我们想要实现的过程?呵呵。看一下它的主要成员:

    实现源码为:

成员

类型

描述

BaseURI

属性

当前的URL地址

DownloadData

方法

从一个URI下载数据,以字节数组的形式返回

DownloadFile

方法

从一个URI下载数据,保存为本地文件

OpenRead

方法

以流的形式打开并执行读操作

OpenWrite

方法

打开一个流用于向URI写数据

UploadData

方法

向URI上传数据

UploadFile

方法

把一个本地文件上载到制定URI

UploadValues

方法

NameValueCollection 发送到资源并返回包含任何响应的字节数组
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using System.Net;
  9. using System.IO;
    1. namespace wiindowsFormsApplication
  10. {
  11.     public partial class Form1 : Form
  12.     {
  13.         public Form1()
  14.         {
  15.             InitializeComponent();
  16.             this.textBox1.Text = @"";
  17.         }
    1.         WebClient webClient = new WebClient();
  18.         private void btn_down_Click(object sender, EventArgs e)
  19.         {
  20.             
  21.             if (webClient.IsBusy)//是否存在正在进行中的Web请求
  22.             {
  23.                 webClient.CancelAsync();
  24.             }
  25.             //为webClient添加事件
  26.             webClient.DownloadProgressChanged +=new DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
  27.             webClient.DownloadFileCompleted+=new AsyncCompletedEventHandler(webClient_DownloadFileCompleted);
  28.             //开始下载
  29.             webClient.DownloadFileAsync(new Uri(this.textBox1.Text), "aa.rar");
  30.         }
  31.         
  32.         private void webClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
  33.         {            
  34.             this.progressBar1.Value = e.ProgressPercentage;
  35.             this.lbl_pro.Text = e.ProgressPercentage.ToString() + "%";
  36.             this.lbl_detail.Text = string.Format("正在下载文件,完成进度{0}/{1}(字节)"
  37.                                 ,e.BytesReceived
  38.                                 ,e.TotalBytesToReceive);
  39.         }
    1.         private void webClient_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
  40.         {
  41.             if (e.Cancelled)
  42.                 MessageBox.Show("下载被取消!");
  43.             else
  44.                 MessageBox.Show("下载完成!");
  45.         }
    1.         private void btn_cancel_Click(object sender, EventArgs e)
  46.         {
  47.             this.webClient.CancelAsync();
  48.             this.webClient.Dispose();
  49.         }
  50.     }
  51. }

 

运行界面:

具体看一下如何下载文件或数据:

图片 1

WebClient提供了大概三种方式从网上下载数据:

转载:

1. DownloadData

从资源下载数据并返回字节数组。

Public Function DownloadData( ByVal address As String ) As Byte()
接受一个参数,address是从中下载数据的 URI。注意返回的是一个字节数组,我在以前的文章中提到过很多次,我们可以很简单的转换为我们需要的格式。
看一个代码:
Dim wc As New System.Net.WebClient() ‘跟网络相关的类一般都在System.Net下
Dim html As String = Encoding.ASCII.GetString(wc.DownloadData("http:www.csdn.net"))
Debug.WriteLine(html)
你就会得到很长的一个String,实际上就是CSDN第一页的源代码。

 

2.

DownloadFile

从具有指定 URI 的资源将数据下载到本地文件

Public Sub DownloadFile( ByVal address As String, ByVal fileName As String )
address :从中下载数据的 URI。

FileName :要接收数据的本地文件的名称。

使用也很简单:
Dim wc As New System.Net.WebClient()
wc.DownloadFile("")
成功运行后,本地机的C:会多出一个小图片,就是VS.NET 4CD的广告。
3. OpenRead

为从具有指定 URI 的资源下载的数据打开一个可读的流。

Public Function OpenRead(ByVal address As String ) As Stream

参数

address 从中下载数据的 URI。

流的概念熟悉吗?不熟的话看一下我以前的文章吧,很基本的操作都有。

下面的示例打开由 uriString 标识的资源并将结果显示在系统控制台上。请注意,由 OpenRead 返回的 Stream 在读取完数据之后将被关闭。

Dim myWebClient As New System.Net.WebClient()
Dim uriString As String=""
Console.WriteLine("Accessing {0} ...", uriString)
Dim myStream As Stream = myWebClient.OpenRead(uriString)
Console.WriteLine(ControlChars.Cr + "Displaying Data :" + ControlChars.Cr)
Dim sr As New StreamReader(myStream)
Console.WriteLine(sr.ReadToEnd())
myStream.Close()

上传数据
有下载必然有上传,同样对应的WebClient也有很多中上传数据的方法,除了跟上面对应的UploadData、UploadFile、OpenWrite外还有一种UploadValues,UploadValues将NameValueCollection 发送到资源并返回包含任何响应的字节数组,可以用于那些有表单的网页。
例子就不写了,MSDN中ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfsystemnetwebclientclasstopic.htm都有详细的介绍,在此不再赘述。

总结:
简单介绍了WebClient的主要方法和应用,实际上WebClient可以完成一些比较简单的操作,试想,如果服务器要求我们输入密码和用户名才能访问怎么办?或者其他的编程细节要处理?那就是我们下次介绍的WebRequest 和 WebResponse。

上一次介绍了WebClient的一些下载和上传数据的方法,今天着重看一下WebRequest 和 WebResponse两种我们访问Internet常用的类,严格说,WebRequest是一个抽象基类,我们一般用它的衍生类HttpWebRequest 以及 FileWebRequest,FTP的访问需要手动注册,具体看后面的插入协议。

从逻辑角度上讲,Net classes 包含三个层:请求/响应层、应用协议层和传输层,依次展开,从应用程序到网络。WebRequest 和 WebResponse 类代表请求/响应层。HTTP、TCP 和 UDP 类组成了应用协议层,而套接字存在于传输层中。WebRequest/WebResponse 和 HTTP 可以在 System.Net 名称空间中找到,而 TCP/UDP 和套接字则处在 System.Net.Sockets 名称空间中,包括也常用的UDPClient、TCPCLient。

WebRequest 和 WebResponse(请求/响应模型)

请求/响应模型位于顶部,提供一种简单的方式访问 Web 上的资源。WebRequest 是 .NET 框架的用于访问 Internet 数据的请求/响应模型的抽象基类。使用该请求/响应模型的应用程序可以用协议不可知的方式从 Internet 请求数据,什么意思?就是协议不具体。

这两种类提供了一种访问网上资源的一般方式。WebRequest 表示一个网络请求,包含诸如 RequestURI、Headers、Credentials 和 ContentType 等属性。WebRequest 上的主要方法有 GetRequestStream、GetResponse 以及它们的异步方法Begin/EndGetRequestStream 和 Begin/EndGetResponse。 GetRequestStream 用于获取流以便将数据上载到服务器。GetResponse 用于获取服务器返回的响应对象。WebResponse 表示从处理该请求的服务器接收回的响应。其关键属性有 ContentLength、ContentType、headers、ResponseURI 和 Status。WebResponse 上最常用的方法是 GetResponseStream,它用于从服务器读取(下载)数据。

当对 WebRequest.GetResponse 进行调用时,通常发出实际的网络请求。

这个示例显示如何获取一个 Web 页并将其内容输出:

Dim url As New Uri("") ‘定义一个URI

Dim Req As WebRequest

Req = WebRequest.Create(url)

Dim Resp As WebResponse

Try

Resp = Req.GetResponse ‘获得一个响应

Catch exc As Exception

MsgBox(exc.Message)

End Try

Dim netStream As StreamReader

netStream = New StreamReader(Resp.GetResponseStream)

Debug.WriteLine(netStream.ReadToEnd)

当然,上面的例子只是一个简单的操作,可以返回一个流式的数据。下面充分挖掘一下它们的优势(与WebClient相比)。

可插入协议

当某个应用程序仅仅使用 WebRequest 和 WebResponse 类时,无需修改应用程序的任何代码就可以“插入”和使用新的协议。注册一个带 WebRequestFactory 的 URI 模式在程序的持续时间内插入协议支持。注册是通过调用 WebRequestFactory.Register() 方法完成的。对于 HTTP 协议,这种方法是从内部调用的,因此它被默认注册;尽管如此,在将来可以实现和注册任意数目的其他协议。当然,由于 Internet 上的协议数量巨大,这种模型并不是对所有的情况都理想。那些“饶舌”的或另外排斥请求/响应模型的协议可能会在 TCP 或 UDP 类中更好地执行,或者在某些情况下会在 Sockets 类中更好地执行。有关HTTP方面的操作我们可以使用HttpWebRequest。

下面说明几个具体问题:

1. 程序分块

当应用程序需要发送或接收数据,而数据的准确大小在下载/上载开始时还未知时,程序分块是有用的。当基于其他应用程序或服务器逻辑正在创建所讨论的数据时,使用程序分块技术是最普遍的。要发送分块的数据,应该将 WebRequest 转换为 HttpWebRequest 并且将 HttpWebRequest.SendChunked 的属性设置为TRUE。如果直接用HttpWebRequest自然就免了:)

2.HTTP 管道技术

管道技术是 HTTP 1.1 的一项功能,它允许 Net classes 通过持久性连接向后端服务器发送多个 HTTP 请求,而无需在发出下次请求之前等待来自服务器的响应。这会显著影响性能,因为从服务器请求多个资源的应用程序不会被阻塞而等待某个特定资源(可能是服务器上一个非常耗时的操作,如数据库查找)。

  1. 身份验证
    Net classes 支持各种客户机身份验证机制,包括“摘要”、“基本”、Kerberos、NTLM 和“定制”。身份验证是通过在作出请求前对 WebRequest.Credentials 对象进行设置来达到的。在“摘要”和“基本”情况下,会指定用户名和口令。对于 NTLM 或 Kerberos,则使用 Windows 安全机制,并且 Credential 对象或者可以被设置为用户名、口令和域的结合,或者可以请求使用系统默认值。

4.代理支持
在 Net classes 中的 HTTP 代理支持可以在每个请求的基础上进行控制,或者可以一次全局性地设置它,用于应用程序的生存期。这样似乎就可以验证Proxy是不是免费;)

总结:

概述了一下访问Internet的另外一种方法,Webresponse WebRequest,以及采用它的一些优势。具体例子和图解参考:

本文由10bet手机官网发布于web前端,转载请注明出处:用WebClient类简单实现网上下载和上传数据,小偷程序

上一篇:委托和事件,委托的作用 下一篇:没有了
猜你喜欢
热门排行
精彩图文