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>&nbsp;</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>listBox1.Items.Add(&quot;Request
Timeout (ms) = &quot; + wrq.Timeout);</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>listBox1.Items.Add(&quot;Request
Keep Alive = &quot; + 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(&quot;Request
AllowAutoRedirect = &quot; + 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(&quot;http://www.wrox.com&quot;);</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 &lt; 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>&nbsp;&nbsp;&nbsp;
listBox1.Items.Add(&quot;Header &quot; + whc.GetKey(i) + &quot; : &quot; +
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>&nbsp; 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(&quot;myusername&quot;, &quot;mypassword&quot;);</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>&nbsp;&nbsp;
InitializeComponent();</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;
WebRequest wrq = WebRequest.Create(&quot;http://www.wrox.com&quot;);</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;
wrq.BeginGetResponse(new AsyncCallback(OnResponse),
wrq);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </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>&nbsp;</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>&nbsp;&nbsp;
WebRequest wrq = (WebRequest)ar.AsyncState;</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;
WebResponse wrs = wrq.EndGetResponse(ar);</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;
// 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>&nbsp;&nbsp;&nbsp;<a href="index.html">首页</a>&nbsp;&nbsp;&nbsp;<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 + -
显示快捷键?