日期:2011-02-07  浏览次数:20492 次

网上下载和上传数据(二)    Montaque(原作)  
  
上一次介绍了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很不错的一篇文章。
<