网上下载和上传数据
有时候,处于程序的需要,程序要求动态的从网络上更新数据,最常见的比如从数据中心下载或上传企业内部数据或者资料;有时候,想做一些类似机器人的工作,让程序自动获取IntraNet亦或InterNet上的资源,可能是新闻、图片、以及你想得到的……这个时候就需要编一些小程序。
今天我主要介绍一下在
.NET
中如何获取网络上的数据,当然可以是局域网,甚至
Local
文件系统。利用
WebClient
类,易如反掌!
关于
WebClient
:
在
MSDN
中,这样描述
WebClient
类:
“提供向
URI
标识的资源发送数据和从
URI
标识的资源接收数据的公共方法”,
默认情况下,
.NET
框架支持以
http:
、
https:
和
file:
方案标识符开头的
URI
。是不是封装了很多我们想要实现的过程?呵呵。看一下它的主要成员:
成员
|
类型
|
描述
|
BaseURI
|
属性
|
当前的
URL
地址
|
DownloadData
|
方法
|
从一个
URI
下载数据,以字节数组的形式返回
|
DownloadFile
|
方法
|
从一个
URI
下载数据,保存为本地文件
|
OpenRead
|
方法
|
以流的形式打开并执行读操作
|
OpenWrite
|
方法
|
打开一个流用于向
URI
写数据
|
UploadData
|
方法
|
向
URI
上传数据
|
UploadFile
|
方法
|
把一个本地文件上载到制定
URI
|
UploadValues
|
方法
|
NameValueCollection
发送到资源并返回包含任何响应的字节数组
|
具体看一下如何下载文件或数据:
WebClient
提供了大概三种方式从网上下载数据:
1.
DownloadData
从资源下载数据并返回字节数组。
接受一个参数,
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
的资源将数据下载到本地文件
address
:从中下载数据的
URI
。
FileName
:要接收数据的本地文件的名称。
使用也很简单:
Dim wc As New System.Net.WebClient()
wc.DownloadFile("http://www.csdn.net/images/ad/vsnet_120.gif","c:/test.gif")
成功运行后,本地机的
C:/
会多出一个小图片,就是
VS.NET 4CD
的广告。
3.
OpenRead
为从具有指定
URI
的资源下载的数据打开一个可读的流。
参数
address
从中下载数据的
URI
。
流的概念熟悉吗?不熟的话看一下我以前的文章吧,很基本的操作都有。
Dim myWebClient As New System.Net.WebClient()
Dim uriString As String="http://www.csdn.net"
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("http://www.yahoo.com")
‘定义一个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
请求,而无需在发出下次请求之前等待来自服务器的响应。这会显著影响性能,因为从服务器请求多个资源的应用程序不会被阻塞而等待某个特定资源(可能是服务器上一个非常耗时的操作,如数据库查找)。
3.
身份验证
Net classes
支持各种客户机身份验证机制,包括
“
摘要
”
、
“
基本
”
、
Kerberos
、
NTLM
和
“
定制
”
。身份验证是通过在作出请求前对
WebRequest.Credentials
对象进行设置来达到的。在
“
摘要
”
和
“
基本
”
情况下,会指定用户名和口令。对于
NTLM
或
Kerberos
,则使用
Windows
安全机制,并且
Credential
对象或者可以被设置为用户名、口令和域的结合,或者可以请求使用系统默认值。
4.
代理支持
在
Net classes
中的
HTTP
代理支持可以在每个请求的基础上进行控制,或者可以一次全局性地设置它,用于应用程序的生存期。这样似乎就可以验证
Proxy
是不是免费
;)
总结:
概述了一下访问
Internet
的另外一种方法,
Webresponse WebRequest
,以及采用它的一些优势。具体例子和图解参考:
http://www.microsoft.com/china/msdn/library/techart/pdc_websvc.ASP
很不错的一篇文章。