100165783.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 363 行 · 第 1/2 页
HTM
363 行
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>
31.2 WebRequest类和WebResponse类
</title></head>
<body>
<div class="area">
<div class="col1">
<div class="lineBlue">
</div>
<!-- title -->
<div class="arcTitle">
<h1>
<a href="../16">
C#高级编程(第3版)【全文连载】
</a>
</h1>
<div style="text-align: center; font-size: 15px">
<a href="100165783.htm">
31.2 WebRequest类和WebResponse类
</a>
</div>
<div style="text-align: center; font-size: 15px">
<a class="url" href="../../default.htm">http://book.csdn.net/</a>
2006-10-13 14:41:00
</div>
<div style="margin: 0px auto; width: 700px; border: solid 1px #0b5f98;">
<div style="float: left; width: 16px; background-color: #0b5f98; color: White; padding: 1px;">
图书导读
</div>
<div style="float: right; width: 670px; text-align: left; line-height: 16pt; padding-left: 2px">
<!--导读-->
<h1 id="divCurrentNode" style="color: #b83507; width: 100%; text-align: left; font-size: 12px; padding-left: 2px">当前章节:<a href='100165783.htm'><font color='red'>31.2 WebRequest类和WebResponse类</font></a></h1>
<div id="divRelateNode" style="padding-left: 2px">
<div style='float:left;width:49%'>·<a href='100165780.htm'>31.1.1 下载文件</a></div><div style='float:right;width:49%'>·<a href='100165781.htm'>31.1.2 基本的Web客户示例</a></div><div style='float:left;width:49%'>·<a href='100165782.htm'>31.1.3 上传文件</a></div><div style='float:right;width:49%'>·<a href='100165784.htm'>31.3 把输出结果显示为HTML页面</a></div><div style='float:left;width:49%'>·<a href='100165785.htm'>31.4 实用工具类</a></div><div style='float:right;width:49%'>·<a href='100165786.htm'>31.4.1 URI</a></div></div>
</div>
</div>
</div>
<!-- main -->
<div id="main">
<div id="text"> <link href="css.css" rel="stylesheet" type="text/css" /><h3 style='margin-top:11.4pt;margin-right:0cm;FTEL:11.4pt;margin-left:
0cm'><a FTEL="_Toc535009261"></a><a FTEL="_Toc507815532"><span lang=EN-US>31.2 WebRequest</span></a><span
style='font-family:楷体_GB2312'>类</span><span style='font-family:楷体_GB2312'>和</span><span
lang=EN-US>WebResponse</span><span style='font-family:楷体_GB2312'>类</span></h3>
<p class=MsoNormal><span lang=EN-US>WebClient</span><span style='font-family:
宋体'>类使用起来比较简单,但是它的功能非常有限,特别是不能使用它提供身份验证证书。这样,在上传数据时问题就出现了,许多站点都不会接受没有身份验证的上传文件。尽管可以给请求添加标题信息并检查响应中的标题信息,但这仅限于一般意义上的检查,对于任何一个协议,</span><span
lang=EN-US>WebClient</span><span style='font-family:宋体'>没有具体的支持。由于</span><span
lang=EN-US>WebClient</span><span style='font-family:宋体'>是通用的类,主要用于处理发送请求和接收响应的协议</span><span
lang=EN-US>(</span><span style='font-family:宋体'>例如</span><span lang=EN-US>HTTP</span><span
style='font-family:宋体'>、</span><span lang=EN-US>FTP</span><span
style='font-family:宋体'>等</span><span lang=EN-US>)</span><span style='font-family:
宋体'>。它不能处理任一协议的任何附加特性,例如专用于</span><span lang=EN-US>HTTP</span><span
style='font-family:宋体'>的</span><span lang=EN-US>cookie</span><span
style='font-family:宋体'>。如果想利用这些特性,就需要使用</span><span lang=EN-US>System.Net</span><span
style='font-family:宋体'>命名空间中以</span><span lang=EN-US>WebRequest</span><span
style='font-family:宋体'>类和</span><span lang=EN-US>WebResponse</span><span
style='font-family:宋体'>类为基类的一系列类。</span></p>
<p class=MsoNormal><span style='font-family:宋体'>首先讨论怎样使用这些类下载</span><span
lang=EN-US>Web</span><span style='font-family:宋体'>页——这个示例与前面的示例一样,但使用</span><span
lang=EN-US>WebRequest</span><span style='font-family:宋体'>类和</span><span
lang=EN-US>WebResponse</span><span style='font-family:宋体'>类。在此过程中,将解释涉及到的类的层次结构,然后阐述怎样利用这个层次所支持的其他</span><span
lang=EN-US>HTTP</span><span style='font-family:宋体'>特性。</span></p>
<p class=MsoNormal><span style='font-family:宋体'>下面的代码是在</span><span lang=EN-US>BasicWebClient</span><span
style='font-family:宋体'>示例的基础上修改而成的,目的是让它使用</span><span lang=EN-US>WebRequest</span><span
style='font-family:宋体'>类和</span><span lang=EN-US>WebResponse</span><span
style='font-family:宋体'>类。</span></p>
<p class=a6 style='margin-top:8.15pt;margin-right:0cm;FTEL:0cm;
margin-left:21.45pt;FTEL:.0001pt;FTEL:18.45pt'><span
lang=EN-US>public Form1()</span></p>
<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>{</span></p>
<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
InitializeComponent();</span></p>
<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US> </span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
WebRequest wrq = WebRequest.Create("http://www.wrox.com");</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
WebResponse wrs = wrq.GetResponse();</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
Stream strm = wrs.GetResponseStream();</span></p>
<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
StreamReader sr = new StreamReader(strm);</span><span
class=MsoCommentReference><span lang=EN-US style='font-size:8.0pt;color:black;
display:none;letter-spacing:.2pt'> </span></span></p>
<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
string line;</span></p>
<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
while ( (line = sr.ReadLine()) != null)</span></p>
<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
{</span></p>
<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
listBox1.Items.Add(line);</span></p>
<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
}</span></p>
<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
strm.Close();</span></p>
<p class=a6 style='margin-top:0cm;margin-right:0cm;FTEL:8.15pt;
margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>}</span></p>
<p class=MsoNormal><span style='font-family:宋体'>在这段代码中,首先对代表</span><span
lang=EN-US>Web</span><span style='font-family:宋体'>请求的对象进行实例化。但在此并不是使用构造函数来实例化对象,而是调用静态的</span><span
lang=EN-US>WebRequest.Create()</span><span style='font-family:宋体'>方法,在下一小节中将解释这样做的原因。</span><span
lang=EN-US>WebRequest</span><span style='font-family:宋体'>类是支持不同网络协议的类层次结构的一部分,为了给请求类型接收一个对正确对象的引用,需要一个工厂</span><span
lang=EN-US>(factory)</span><span style='font-family:宋体'>机制。</span><span
lang=EN-US>WebRequest.Create()</span><span style='font-family:宋体'>方法会为给定的协议创建合适的</span><span
lang=EN-US> </span><span style='font-family:宋体'>对象。</span></p>
<p class=MsoNormal><span lang=EN-US>WebRequest</span><span style='font-family:
宋体'>类代表要给某个</span><span lang=EN-US>URI</span><span style='font-family:宋体'>发送信息的请求,</span><span
lang=EN-US>URI</span><span style='font-family:宋体'>作为参数传送给</span><span
lang=EN-US>Create()</span><span style='font-family:宋体'>方法。</span><span
lang=EN-US>WebResponse</span><span style='font-family:宋体'>类代表从服务器获取的数据。调用</span><span
lang=EN-US>WebRequest.GetResponse()</span><span style='font-family:宋体'>方法,实际上是把请求发送给</span><span
lang=EN-US>Web</span><span style='font-family:宋体'>服务器,创建一个</span><span
lang=EN-US>Response</span><span style='font-family:宋体'>对象,检查返回的数据。与</span><span
lang=EN-US>WebClient</span><span style='font-family:宋体'>对象一样,可以得到一个代表数据的数据流,但是,这里的数据流是使用</span><span
lang=EN-US>WebResponse.GetResponseStream()</span><span style='font-family:宋体'>方法获得的。</span></p>
<p class=MsoNormal><span style='font-family:宋体'>下面将讨论</span><span lang=EN-US>WebRequest</span><span
style='font-family:宋体'>和</span><span lang=EN-US>WebResponse</span><span
style='font-family:宋体'>的其他特性。我们将会看到</span><span lang=EN-US>WebRequest</span><span
style='font-family:宋体'>和</span><span lang=EN-US>WebResponse</span><span
style='font-family:宋体'>和其他相关的类提供的良好支持。</span></p>
<h4 style='FTEL:21.45pt'><span lang=EN-US>1.</span><span lang=EN-US
style='font-family:"Times New Roman"'> </span><span lang=EN-US> HTTP</span><span
style='font-family:黑体'>标题信息</span></h4>
<p class=MsoNormal><span lang=EN-US>HTTP</span><span style='font-family:宋体'>协议的一个重要方面就是能够利用请求和响应数据流发送扩展的标题信息。标题信息可以包括</span><span
lang=EN-US>cookies</span><span style='font-family:宋体'>、以及发送请求的特定浏览器</span><span
lang=EN-US>(</span><span style='font-family:宋体'>用户代理</span><span lang=EN-US>)</span><span
style='font-family:宋体'>的一些详细信息。</span><span lang=EN-US>.NET Framework</span><span
style='font-family:宋体'>为访问最重要的数据提供了支持。</span><span lang=EN-US>WebRequest</span><span
style='font-family:宋体'>类和</span><span lang=EN-US>WebResponse</span><span
style='font-family:宋体'>类提供了读取标题信息的一些支持。而两个派生的类</span><span lang=EN-US>HttpWebRequest</span><span
style='font-family:宋体'>类和</span><span lang=EN-US>HttpWebResponse</span><span
style='font-family:宋体'>类提供了其他</span><span lang=EN-US>HTTP</span><span
style='font-family:宋体'>特定的信息。如后面所述,用</span><span lang=EN-US>HTTP URI</span><span
style='font-family:宋体'>创建</span><span lang=EN-US>WebRequest</span><span
style='font-family:宋体'>会生成一个</span><span lang=EN-US>HttpWebRequest</span><span
style='font-family:宋体'>对象实例。因为</span><span lang=EN-US>HttpWebRequest</span><span
style='font-family:宋体'>派生自</span><span lang=EN-US>WebRequest</span><span
style='font-family:宋体'>,可以在需要</span><span lang=EN-US>WebRequest</span><span
style='font-family:宋体'>的任何地方使用新实例。另外,还可以把实例的类型强制转换为</span><span lang=EN-US>HttpWebRequest</span><span
style='font-family:宋体'>引用,访问</span><span lang=EN-US>HTTP</span><span
style='font-family:宋体'>协议特定的属性。同样,在使用</span><span lang=EN-US>HTTP</span><span
style='font-family:宋体'>时,</span><span lang=EN-US>GetResponse()</span><span
style='font-family:宋体'>方法调用会把</span><span lang=EN-US>HttpWebResponse</span><span
style='font-family:宋体'>实例返回为</span><span lang=EN-US>HttpWebResponse</span><span
style='font-family:宋体'>引用,也可以进行一个简单的强制转换,以访问</span><span lang=EN-US>HTTP</span><span
style='font-family:宋体'>特定的特性。</span></p>
<p class=MsoNormal><span style='font-family:宋体'>可以在</span><span lang=EN-US>GetResponse()</span><span
style='font-family:宋体'>方法调用之前添加如下代码,检查两个标题属性:</span></p>
<p class=2 style='margin-top:8.15pt;margin-right:0cm;FTEL:0cm;
margin-left:21.45pt;FTEL:.0001pt;FTEL:18.45pt'><span
lang=EN-US>WebRequest wrq = WebRequest.Create("http://www.wrox.com");</span></p>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?