100165783.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 363 行 · 第 1/2 页
HTM
363 行
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>HttpWebRequest
hwrq = (HttpWebRequest)wrq;</span></p>
<p class=2 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>listBox1.Items.Add("Request
Timeout (ms) = " + wrq.Timeout);</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>listBox1.Items.Add("Request
Keep Alive = " + hwrq.KeepAlive);</span></p>
<p class=2 style='margin-top:0cm;margin-right:0cm;FTEL:8.15pt;
margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>listBox1.Items.Add("Request
AllowAutoRedirect = " + hwrq.AllowAutoRedirect);</span></p>
<p class=MsoNormal><span lang=EN-US>Timeout</span><span style='font-family:
宋体'>属性的单位是毫秒,其默认值是</span><span lang=EN-US>100 000</span><span style='font-family:
宋体'>。可以设置这个属性,以控制</span><span lang=EN-US>WebRequest</span><span
style='font-family:宋体'>对象在产生</span><span lang=EN-US>WebException</span><span
style='font-family:宋体'>之前要在响应中等待多长时间。可以检查属性</span><span lang=EN-US>WebException.Status</span><span
style='font-family:宋体'>,看看产生异常的原因。这个枚举类型包括超时的状态码、连接失败、协议错误等。</span></p>
<p class=MsoNormal><span lang=EN-US>KeepAlive</span><span style='font-family:
宋体'>属性是对</span><span lang=EN-US>HTTP</span><span style='font-family:宋体'>协议的特定扩展,所以可以通过</span><span
lang=EN-US>HttpWebRequest</span><span style='font-family:宋体'>引用访问这个属性。该属性允许多个请求使用同一个连接,在后续的请求中节省关闭和重新打开连接的时间。其默认值为</span><span
lang=EN-US>true</span><span style='font-family:宋体'>。</span></p>
<p class=MsoNormal><span lang=EN-US>AllowAutoRedirect</span><span
style='font-family:宋体'>属性也是专用于</span><span lang=EN-US>HttpWebRequest</span><span
style='font-family:宋体'>类的,使用这个属性可以控制</span><span lang=EN-US>Web</span><span
style='font-family:宋体'>请求是否应自动跟随</span><span lang=EN-US>Web</span><span
style='font-family:宋体'>服务器上的重定向响应。其默认值也是</span><span lang=EN-US>true</span><span
style='font-family:宋体'>。如果只允许有限的重定向,可以把</span><span lang=EN-US>HttpWebRequest</span><span
style='font-family:宋体'>的</span><span lang=EN-US>MaximumAutomaticRedirections</span><span
style='font-family:宋体'>属性设置为想要的数值。</span></p>
<p class=MsoNormal><span style='font-family:宋体'>请求和响应类把大多数重要的标题显示为属性,也可以使用</span><span
lang=EN-US>Headers</span><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>
<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>WebHeaderCollection
whc = wrs.Headers;</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>for(int
i = 0; i < whc.Count; i++)</span></p>
<p class=2 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>
listBox1.Items.Add("Header " + whc.GetKey(i) + " : " +
whc[i]);</span></p>
<p class=2 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>31-2</span><span style='font-family:宋体'>所示的标题列表。</span></p>
<p align=center><span lang=EN-US><img width=238 height=140
src="31/image002.jpg"></span></p>
<p align=center style='FTEL:0cm;FTEL:.0001pt'><span
style='font-family:宋体'>图</span><span lang=EN-US> 31-2</span></p>
<h4 style='FTEL:21.45pt'><span lang=EN-US>2. </span><span
style='font-family:黑体'>身份验证</span></h4>
<p class=MsoNormal><span lang=EN-US>WebRequest</span><span style='font-family:
宋体'>类中的另一个属性是</span><span lang=EN-US>Credentials</span><span style='font-family:
宋体'>。如果需要把身份验证证书附带在请求中,就可以用用户名和密码创建</span><span lang=EN-US>NetworkCredential</span><span
style='font-family:宋体'>类</span><span lang=EN-US>(</span><span style='font-family:
宋体'>也在</span><span lang=EN-US>System.Net</span><span style='font-family:宋体'>命名空间中</span><span
lang=EN-US>)</span><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>NetworkCredential myCred = new
NetworkCredential("myusername", "mypassword");</span></p>
<p class=2 style='margin-top:0cm;margin-right:0cm;FTEL:8.15pt;
margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>wrq.Credentials =
myCred;</span></p>
<h4 style='FTEL:21.45pt'><span lang=EN-US>3. </span><span
style='font-family:黑体'>异步页面请求</span></h4>
<p class=MsoNormal><span lang=EN-US>WebRequest</span><span style='font-family:
宋体'>类的另一个特性就是可以异步请求页面。由于在给主机发送请求到接收响应之间有很长的延迟,因此,异步请求页面就显得比较重要。像</span><span
lang=EN-US>WebClient.</span><span
lang=EN-US>DownloadData()</span><span style='font-family:宋体'>和</span><span
lang=EN-US>WebRequest.GetResponse()</span><span style='font-family:宋体'>等方法,在响应没有从服务器回来之前,是不会返回的。如果不希望在那段时间中应用程序处于等待状态,可以使用</span><span
lang=EN-US>BeginGetResponse() </span><span style='font-family:宋体'>方法和</span> <span lang=EN-US>EndGetResponse()</span><span style='font-family:宋体'>方法,</span><span
lang=EN-US>BeginGetResponse()</span><span style='font-family:宋体'>方法可以异步工作,并立即返回。在底层,运行库会异步管理一个后台线程,从服务器上接收响应。</span><span
lang=EN-US>BeginGetResponse() </span><span style='font-family:宋体'>方法不返回</span><span
lang=EN-US>WebResponse</span><span style='font-family:宋体'>对象,而是返回一个执行</span><span
lang=EN-US>IAsyncResult</span><span style='font-family:宋体'>接口的对象。使用这个接口可以选择或等待可用的响应,然后调用</span><span
lang=EN-US>EndGetResponse()</span><span style='font-family:宋体'>搜集结果。</span></p>
<p class=MsoNormal><span style='font-family:宋体'>也可以把一个回调委托发送给</span><span
lang=EN-US>BeginGetResponse()</span><span style='font-family:宋体'>方法。该回调委托的目的地是一个返回类型为</span><span
lang=EN-US>void</span><span style='font-family:宋体'>并把</span><span lang=EN-US>IAsyncResult</span><span
style='font-family:宋体'>引用作为参数的方法,当工作线程完成了搜集响应的任务后,运行库就调用该回调委托,通知用户工作已完成。如下面的代码所示,在回调方法中调用</span><span
lang=EN-US>EndGetResponse()</span><span style='font-family:宋体'>可以接收</span><span
lang=EN-US>WebResponse</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>public Form1()</span></p>
<p class=2 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>
InitializeComponent();</span></p>
<p class=2 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>
wrq.BeginGetResponse(new AsyncCallback(OnResponse),
wrq); </span></p>
<p class=2 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> </span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>protected
void OnResponse(IAsyncResult ar)</span></p>
<p class=2 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)ar.AsyncState;</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
WebResponse wrs = wrq.EndGetResponse(ar);</span></p>
<p class=2 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>
// read the response ...</span></p>
<p class=2 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>BeginGetResponse()</span><span style='font-family:宋体'>的第二个参数,检索最初的</span><span
lang=EN-US>WebRequest</span><span style='font-family:宋体'>对象。第三个参数是一个对象引用,称为状态参数,在回调方法中,可以使用</span><span
lang=EN-US>IAsyncResult</span><span style='font-family:宋体'>的</span><span
lang=EN-US>AsyncState</span><span style='font-family:宋体'>属性检索相同的状态对象。</span></p>
</div>
<!-- page -->
<div class="page" style="text-align: center">
<a href="100165782.htm">上一页</a> <a href="index.html">首页</a> <a href="100165784.htm">下一页</a>
</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="divCurrentNode2" 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="divRealteNod2" 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>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?