﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-KiMoGiGi 技术文集-随笔分类-网络编程</title><link>http://www.cnitblog.com/seeyeah/category/7544.html</link><description>不在乎选择什么，而在乎坚持多久……</description><language>zh-cn</language><lastBuildDate>Tue, 27 Sep 2011 21:32:17 GMT</lastBuildDate><pubDate>Tue, 27 Sep 2011 21:32:17 GMT</pubDate><ttl>60</ttl><item><title>HTTP协议 2</title><link>http://www.cnitblog.com/seeyeah/archive/2008/08/26/48396.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Tue, 26 Aug 2008 13:55:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2008/08/26/48396.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/48396.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2008/08/26/48396.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/48396.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/48396.html</trackback:ping><description><![CDATA[<div class=postBody>引用<a class=postTitle2 id=AjaxHolder_ctl01_TitleUrl href="http://www.cnblogs.com/JustinYoung/articles/731369.html"><u><font color=#800080>HTTP协议</font></u></a> <br><br>众所周知，Internet的基本协议是TCP/IP协议，目前广泛采用的FTP、Archie Gopher等是建立在TCP/IP协议之上的应用层协议，不同的协议对应着不同的应用。<br>　　WWW服务器使用的主要协议是HTTP协议，即超文体传输协议。由于HTTP协议支持的服务不限于WWW，还可以是其它服务，因而HTTP协议允许用户在统一的界面下，采用不同的协议访问不同的服务，如FTP、Archie、SMTP、NNTP等。另外，HTTP协议还可用于名字服务器和分布式对象管理。<br><br>2.1　HTTP协议简介<br>　　HTTP是一个属于应用层的面向对象的协议，由于其简捷、快速的方式，适用于分布式超媒体信息系统。它于1990年提出，经过几年的使用与发展，得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版，HTTP/1.1的规范化工作正在进行之中，而且HTTP-NG(Next Generation of HTTP)的建议已经提出。<br>　　HTTP协议的主要特点可概括如下：<br>1.支持客户/服务器模式。<br>2.简单快速：客户向服务器请求服务时，只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。<br>由于HTTP协议简单，使得HTTP服务器的程序规模小，因而通信速度很快。<br>3.灵活：HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。<br>4.无连接：无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求，并收到客户的应答后，即断开连接。采用这种方式可以节省传输时间。<br>5.无状态：HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息，则它必须重传，这样可能导致每次连接传送的数据量增大。另一方面，在服务器不需要先前信息时它的应答就较快。<br><br>2.2　HTTP协议的几个重要概念<br>　　1.连接(Connection)：一个传输层的实际环流，它是建立在两个相互通讯的应用程序之间。 <br>　　2.消息(Message)：HTTP通讯的基本单位，包括一个结构化的八元组序列并通过连接传输。<br>　　3.请求(Request)：一个从客户端到服务器的请求信息包括应用于资源的方法、资源的标识符和协议的版本号<br>　　4.响应(Response)：一个从服务器返回的信息包括HTTP协议的版本号、请求的状态(例如&#8220;成功&#8221;或&#8220;没找到&#8221;)和文档的MIME类型。<br>　　5.资源(Resource)：由URI标识的网络数据对象或服务。<br>　　6.实体(Entity)：数据资源或来自服务资源的回映的一种特殊表示方法，它可能被包围在一个请求或响应信息中。一个实体包括实体头信息和实体的本身内容。<br>　　7.客户机(Client)：一个为发送请求目的而建立连接的应用程序。<br>　　8.用户代理(User agent)：初始化一个请求的客户机。它们是浏览器、编辑器或其它用户工具。<br>　　9.服务器(Server)：一个接受连接并对请求返回信息的应用程序。<br>　　10.源服务器(Origin server)：是一个给定资源可以在其上驻留或被创建的服务器。<br>　　11.代理(Proxy)：一个中间程序，它可以充当一个服务器，也可以充当一个客户机，为其它客户机建立请求。请求是通过可能的翻译在内部或经过传递到其它的服务器中。一个代理在发送请求信息之前，必须解释并且如果可能重写它。<br>　　代理经常作为通过防火墙的客户机端的门户，代理还可以作为一个帮助应用来通过协议处理没有被用户代理完成的请求。<br>　　12.网关(Gateway)：一个作为其它服务器中间媒介的服务器。与代理不同的是，网关接受请求就好象对被请求的资源来说它就是源服务器；发出请求的客户机并没有意识到它在同网关打交道。<br>　　网关经常作为通过防火墙的服务器端的门户，网关还可以作为一个协议翻译器以便存取那些存储在非HTTP系统中的资源。<br>　　13.通道(Tunnel)：是作为两个连接中继的中介程序。一旦激活，通道便被认为不属于HTTP通讯，尽管通道可能是被一个HTTP请求初始化的。当被中继的连接两端关闭时，通道便消失。当一个门户(Portal)必须存在或中介(Intermediary)不能解释中继的通讯时通道被经常使用。<br>　　14.缓存(Cache)：反应信息的局域存储。<br><br>2.3　HTTP协议的运作方式<br>　　HTTP协议是基于请求／响应范式的。一个客户机与服务器建立连接后，发送一个请求给服务器，请求方式的格式为，统一资源标识符、协议版本号，后边是MIME信息包括请求修饰符、客户机信息和可能的内容。服务器接到请求后，给予相应的响应信息，其格式为一个状态行包括信息的协议版本号、一个成功或错误的代码，后边是MIME信息包括服务器信息、实体信息和可能的内容。<br>　　许多HTTP通讯是由一个用户代理初始化的并且包括一个申请在源服务器上资源的请求。最简单的情况可能是在用户代理(UA)和源服务器(O)之间通过一个单独的连接来完成(见图2-1)。<br>图2-1<br>　　当一个或多个中介出现在请求／响应链中时，情况就变得复杂一些。中介由三种：代理(Proxy)、网关(Gateway)和通道(Tunnel)。一个代理根据URI的绝对格式来接受请求，重写全部或部分消息，通过URI的标识把已格式化过的请求发送到服务器。网关是一个接收代理，作为一些其它服务器的上层，并且如果必须的话，可以把请求翻译给下层的服务器协议。一个通道作为不改变消息的两个连接之间的中继点。当通讯需要通过一个中介(例如：防火墙等)或者是中介不能识别消息的内容时，通道经常被使用。 图2-2<br>　　上面的图2-2表明了在用户代理(UA)和源服务器(O)之间有三个中介(A,B和C)。一个通过整个链的请求或响应消息必须经过四个连接段。这个区别是重要的，因为一些HTTP通讯选择可能应用于最近的连接、没有通道的邻居，应用于链的终点或应用于沿链的所有连接。尽管图2-2是线性的，每个参与者都可能从事多重的、并发的通讯。例如，B可能从许多客户机接收请求而不通过A，并且／或者不通过C把请求送到A，在同时它还可能处理A的请求。<br>　　任何针对不作为通道的汇聚可能为处理请求启用一个内部缓存。缓存的效果是请求／响应链被缩短，条件是沿链的参与者之一具有一个缓存的响应作用于那个请求。下图说明结果链，其条件是针对一个未被UA或A加缓存的请求，B有一个经过C来自O的一个前期响应的缓存拷贝。<br>图2-3<br>　　在Internet上，HTTP通讯通常发生在TCP/IP连接之上。缺省端口是TCP 80，但其它的端口也是可用的。但这并不预示着HTTP协议在Internet或其它网络的其它协议之上才能完成。HTTP只预示着一个可靠的传输。<br>　　以上简要介绍了HTTP协议的宏观运作方式，下面介绍一下HTTP协议的内部操作过程。<br>　　首先，简单介绍基于HTTP协议的客户/服务器模式的信息交换过程，如图2-4所示，它分四个过程，建立连接、发送请求信息、发送响应信息、关闭连接。<br>图2-4<br>　　在WWW中，&#8220;客户&#8221;与&#8220;服务器&#8221;是一个相对的概念，只存在于一个特定的连接期间，即在某个连接中的客户在另一个连接中可能作为服务器。WWW服务器运行时，一直在TCP80端口(WWW的缺省端口)监听，等待连接的出现。<br>　　下面，讨论HTTP协议下客户/服务器模式中信息交换的实现。 　　1.建立连接 　　连接的建立是通过申请套接字(Socket)实现的。客户打开一个套接字并把它约束在一个端口上，如果成功，就相当于建立了一个虚拟文件。以后就可以在该虚拟文件上写数据并通过网络向外传送。<br>　　2.发送请求<br>　　打开一个连接后，客户机把请求消息送到服务器的停留端口上，完成提出请求动作。<br>　　HTTP/1.0　　请求消息的格式为：<br>　　请求消息=请求行(通用信息|请求头|实体头) CRLF[实体内容]<br>　　请求　行=方法　请求URL　HTTP版本号　CRLF<br>　　方　　法=GET|HEAD|POST|扩展方法<br>　　U　R 　L=协议名称+宿主名+目录与文件名<br>　　请求行中的方法描述指定资源中应该执行的动作，常用的方法有GET、HEAD和POST。不同的请求对象对应GET的结果是不同的，对应关系如下：<br>　　对象　　　　　　GET的结果<br>　　文件　　　　　　文件的内容<br>　　程序　　　　　　该程序的执行结果<br>　　数据库查询　　　查询结果<br>　　HEAD——要求服务器查找某对象的元信息，而不是对象本身。<br>　　POST——从客户机向服务器传送数据，在要求服务器和CGI做进一步处理时会用到POST方法。POST主要用于发送HTML文本中FORM的内容，让CGI程序处理。<br>　　一个请求的例子为：<br>　　GET http://networking.zju.edu.cn/zju/index.htm HTTP/1.0<br>　　头信息又称为元信息，即信息的信息，利用元信息可以实现有条件的请求或应答 。<br>　　请求头——告诉服务器怎样解释本次请求，主要包括用户可以接受的数据类型、压缩方法和语言等。<br>　　实体头——实体信息类型、长度、压缩方法、最后一次修改时间、数据有效期等。<br>　　实体——请求或应答对象本身。<br>　　3.发送响应<br>　　服务器在处理完客户的请求之后，要向客户机发送响应消息。<br>　　HTTP/1.0的响应消息格式如下：<br>　　响应消息=状态行(通用信息头|响应头|实体头)　CRLF　〔实体内容〕<br>　　状 态 行=HTTP版本号　状态码　原因叙述<br>　　状态码表示响应类型<br>　　1&#215;&#215;　　保留<br>　　2&#215;&#215;　　表示请求成功地接收<br>　　3&#215;&#215;　　为完成请求客户需进一步细化请求<br>　　4&#215;&#215;　　客户错误<br>　　5&#215;&#215;　　服务器错误 <br>　　响应头的信息包括：服务程序名，通知客户请求的URL需要认证，请求的资源何时能使用。<br>　　4.关闭连接<br>　　客户和服务器双方都可以通过关闭套接字来结束TCP/IP对话 </div>
<img src ="http://www.cnitblog.com/seeyeah/aggbug/48396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2008-08-26 21:55 <a href="http://www.cnitblog.com/seeyeah/archive/2008/08/26/48396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTTP协议</title><link>http://www.cnitblog.com/seeyeah/archive/2008/08/26/48395.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Tue, 26 Aug 2008 13:53:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2008/08/26/48395.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/48395.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2008/08/26/48395.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/48395.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/48395.html</trackback:ping><description><![CDATA[<p><a href="http://www.teachblog.net/tangzz/archive/2006/11/30/3458.html#25"><u><font color=#800080></font></u></a>&nbsp;</p>
<h2 class=title1>HTTP协议简介</h2>
<h3 class=title2><a name=11></a>HTTP协议简介</h3>
<p align=left>在TCP/IP体系结构中，HTTP属于应用层协议，位于TCP/IP协议的顶层。浏览Web时，浏览器通过HTTP协议与Web服务器交换信息。这些信息（文档）类型的格式由MIME定义。</p>
<p align=left>HTTP协议具有以下的特点： </p>
<ol>
    <li>HTTP按客户/服务器模式工作<br>HTTP支持客户（一般情况是浏览器）与服务器的通讯，相互传输数据。<br>HTTP定义的事务处理由以下四步组成：
    <ul>
        <li>客户与服务器建立连接；
        <li>客户向服务器提出请求；
        <li>如果请求被接受，则服务器送回响应，在响应中包括状态码和所需的文件；
        <li>客户与服务器断开连接 </li>
    </ul>
    <table width="75%">
        <tbody>
            <tr bgColor=#ccccff>
                <td bgColor=#ccccff><em>一次HTTP操作称为一次<font color=#ff0000>事务</font>（<font color=#0000ff>transaction</font>）。</em></td>
            </tr>
        </tbody>
    </table>
    <li>HTTP是无状态的<br>也就是说，浏览器和服务器每进行一次HTTP操作，就建立一次连接，但任务结束就中断连接。
    <li>HTTP使用元信息作为头标<br>HTTP对所有事务都加了<font color=#ff0000>头标</font>（<font color=#0000ff>header</font>）。也就是说，在主要数据前加上一块信息，称为<font color=#ff0000>元信息</font>（<font color=#0000ff>metainformation</font>）。它使服务器能够提供正在传送数据的有关信息。例如，传送对象是哪种类型，是用哪种语言书写的等。<br>从功能上讲，HTTP支持四类元信息：一般信息头标、请求头标、响应头标和实体头标。
    <li>HTTP支持两种请求和响应格式<br>HTTP由不同的两部分组成，一是从浏览器发往服务器的请求，二是服务器对客户的响应。<br>HTTP支持两种请求和响应，即简单请求与完全请求和简单响应与完全响应。
    <li>HTTP是基于文本的简单协议 </li>
</ol>
<h3 class=title2><a name=12></a>HTTP的请求 </h3>
<p>HTTP的常用请求方法：</p>
<table width="85%" border=1>
    <tbody>
        <tr>
            <td width="32%"><strong>方 法</strong> </td>
            <td width="68%"><strong>说 明</strong> </td>
        </tr>
        <tr>
            <td width="32%">GET</td>
            <td width="68%">请求读取一个Web页面</td>
        </tr>
        <tr>
            <td width="32%">HEAD</td>
            <td width="68%">请求读取一个Web页面的头标</td>
        </tr>
        <tr>
            <td width="32%">PUT</td>
            <td width="68%">请求存储一个Web页面</td>
        </tr>
        <tr>
            <td width="32%">POST</td>
            <td width="68%">附加到命名资源中</td>
        </tr>
        <tr>
            <td width="32%">DELETE</td>
            <td width="68%">删除Web页面</td>
        </tr>
        <tr>
            <td width="32%">LINK</td>
            <td width="68%">连接两个已有资源</td>
        </tr>
        <tr>
            <td width="32%">UNLINK</td>
            <td width="68%">取消两个资源之间的已有连接</td>
        </tr>
    </tbody>
</table>
<p>HTTP请求的格式如下所示：</p>
<div class=code>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top> <span style="COLOR: #000000">＜request-line＞<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>＜headers＞<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>＜blank&nbsp;line＞<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>[＜request-body＞]</span> </div>
</div>
<p>在HTTP请求中，第一行必须是一个请求行（request line），用来说明请求类型、要访问的资源以及使用的HTTP版本。紧接着是一个首部（header）小节，用来说明服务器要使用的附加信息。在首部之后是一个空行，再此之后可以添加任意的其他数据[称之为主体（body）]。<br>在HTTP中，定义了大量的请求类型，不过Ajax开发人员关心的只有GET请求和POST请求。只要在Web浏览器上输入一个URL，浏览器就将基于该URL向服务器发送一个GET请求，以告诉服务器获取并返回什么资源。对于<a href="http://www.wzu.edu.cn/"><u><font color=#0000ff>www.wzu.edu.cn</font></u></a>的GET请求如下所示：</p>
<div class=code>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top> <span style="COLOR: #000000">GET&nbsp;/&nbsp;HTTP/1.1<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>Host:&nbsp;www.wzu.edu.cn&nbsp;<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>User-Agent:&nbsp;Mozilla/5.0&nbsp;(Windows;&nbsp;U;&nbsp;Windows&nbsp;NT&nbsp;5.1;&nbsp;en-US;&nbsp;rv:1.7.6)<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>Gecko/20050225&nbsp;Firefox/1.0.1<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>Connection:&nbsp;Keep-Alive&nbsp;</span> </div>
</div>
<p>请求行的第一部分说明了该请求是GET请求。该行的第二部分是一个斜杠（/），用来说明请求的是该域名的根目录。该行的最后一部分说明使用的是HTTP 1.1版本（另一个可选项是1.0）。那么请求发到哪里去呢？这就是第二行的内容。<br>第2行是请求的第一个首部，HOST。首部HOST将指出请求的目的地。结合HOST和上一行中的斜杠（/），可以通知服务器请求的是www.wzu.edu.cn/（HTTP 1.1才需要使用首部HOST，而原来的1.0版本则不需要使用）。第三行中包含的是首部User-Agent，服务器端和客户端脚本都能够访问它，它是浏览器类型检测逻辑的重要基础。该信息由你使用的浏览器来定义（在本例中是Firefox 1.0.1），并且在每个请求中将自动发送。最后一行是首部Connection，通常将浏览器操作设置为Keep-Alive（当然也可以设置为其他值，但这已经超出了本书讨论的范围）。注意，在最后一个首部之后有一个空行。即使不存在请求主体，这个空行也是必需的。</p>
<p>如果要获取一个诸如http://www.wzu.edu.cn/books的www.wzu.edu.cn域内的页面，那么该请求可能类似于：<br></p>
<div class=code>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top> <span style="COLOR: #000000">GET&nbsp;/books/&nbsp;HTTP/1.1<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>Host:&nbsp;www.wzu.edu.cn<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>User-Agent:&nbsp;Mozilla/5.0&nbsp;(Windows;&nbsp;U;&nbsp;Windows&nbsp;NT&nbsp;5.1;&nbsp;en-US;&nbsp;rv:1.7.6)<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>Gecko/20050225&nbsp;Firefox/1.0.1<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>Connection:&nbsp;Keep-Alive</span> </div>
</div>
<p>注意只有第一行的内容发生了变化，它只包含URL中www.wzu.edu.cn后面的部分。</p>
<p>要发送GET请求的参数，则必须将这些额外的信息附在URL本身的后面。其格式类似于：<br></p>
<div class=code>URL ? name1=value1&amp;name2=value2&amp;..&amp;nameN=valueN</div>
<br>该信息称之为查询字符串（query string），它将会复制在HTTP请求的请求行中，如下所示：<br>
<div class=code>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">GET&nbsp;/books/?name=Professional%20Ajax&nbsp;HTTP/1.1<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>Host:&nbsp;www.wzu.edu.cn<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>User-Agent:&nbsp;Mozilla/5.0&nbsp;(Windows;&nbsp;U;&nbsp;Windows&nbsp;NT&nbsp;5.1;&nbsp;en-US;&nbsp;rv:1.7.6)<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>Gecko/20050225&nbsp;Firefox/1.0.1<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>Connection:&nbsp;Keep-Alive</span></div>
</div>
<p>另一方面，POST请求在请求主体中为服务器提供了一些附加的信息。通常，当填写一个在线表单并提交它时，这些填入的数据将以POST请求的方式发送给服务器。</p>
<p>以下就是一个典型的POST请求：<br></p>
<div class=code>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">POST&nbsp;/&nbsp;HTTP/1.1<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>Host:&nbsp;www.wzu.edu.cn<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>User-Agent:&nbsp;Mozilla/5.0&nbsp;(Windows;&nbsp;U;&nbsp;Windows&nbsp;NT&nbsp;5.1;&nbsp;en-US;&nbsp;rv:1.7.6)<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>Gecko/20050225&nbsp;Firefox/1.0.1<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>Content-Type:&nbsp;application/x-www-form-urlencoded<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>Content-Length:&nbsp;40<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>Connection:&nbsp;Keep-Alive<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>name=Professional%20Ajax</span><span style="COLOR: #ff0000">&amp;publisher</span><span style="COLOR: #000000">=Wiley</span></div>
</div>
<p>从上面可以发现， POST请求和GET请求之间有一些区别。首先，请求行开始处的GET改为了POST，以表示不同的请求类型。你会发现首部Host和User-Agent仍然存在，在后面有两个新行。其中首部Content-Type说明了请求主体的内容是如何编码的。浏览器始终以application/ x-www-form- urlencoded的格式编码来传送数据，这是针对简单URL编码的MIME类型。首部Content-Length说明了请求主体的字节数。在首部Connection后是一个空行，再后面就是请求主体。与大多数浏览器的POST请求一样，这是以简单的&#8220;名称—值&#8221;对的形式给出的，其中name是Professional Ajax，publisher是Wiley。你可以以同样的格式来组织URL的查询字符串参数。</p>
<p>正如前面所提到的，还有其他的HTTP请求类型，它们遵从的基本格式与GET请求和POST请求相同。下一步我们来看看服务器将对HTTP请求发送什么响应。</p>
<h3>HTTP响应</h3>
<p>如下所示，HTTP响应的格式与请求的格式十分类似：<br></p>
<div class=code>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">＜status-line＞<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>＜headers＞<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>＜blank&nbsp;line＞<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>[＜response-body＞]</span></div>
</div>
<p>正如你所见，在响应中唯一真正的区别在于第一行中用状态信息代替了请求信息。状态行（status line）通过提供一个状态码来说明所请求的资源情况。以下就是一个HTTP响应的例子： <br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">HTTP/1.1&nbsp;200&nbsp;OK<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>Date:&nbsp;Sat,&nbsp;31&nbsp;Dec&nbsp;2005&nbsp;23:59:59&nbsp;GMT<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>Content-Type:&nbsp;text/html;charset=ISO-8859-1<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>Content-Length:&nbsp;122<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>＜html＞<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>＜head＞<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>＜title＞Wrox&nbsp;Homepage＜/title＞<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>＜/head＞<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>＜body＞<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>＜!--&nbsp;body&nbsp;goes&nbsp;here&nbsp;--＞<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>＜/body＞<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>＜/html＞<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<p><br></p>
<p>在本例中，状态行给出的HTTP状态代码是200，以及消息OK。状态行始终包含的是状态码和相应的简短消息，以避免混乱。最常用的状态码有：</p>
<ul>
    <li>200 (OK): 找到了该资源，并且一切正常。
    <li>304 (NOT MODIFIED): 该资源在上次请求之后没有任何修改。这通常用于浏览器的缓存机制。
    <li>401 (UNAUTHORIZED):<strong></strong>客户端无权访问该资源。这通常会使得浏览器要求用户输入用户名和密码，以登录到服务器。
    <li>403 (FORBIDDEN):<strong></strong>客户端未能获得授权。这通常是在401之后输入了不正确的用户名或密码。
    <li>404 (NOT FOUND):<strong></strong>在指定的位置不存在所申请的资源。 </li>
</ul>
<p>在状态行之后是一些首部。通常，服务器会返回一个名为Date的首部，用来说明响应生成的日期和时间（服务器通常还会返回一些关于其自身的信息，尽管并非是必需的）。接下来的两个首部大家应该熟悉，就是与POST请求中一样的Content-Type和Content-Length。在本例中，首部Content-Type指定了MIME类型HTML（text/html），其编码类型是ISO-8859-1（这是针对美国英语资源的编码标准）。响应主体所包含的就是所请求资源的HTML源文件（尽管还可能包含纯文本或其他资源类型的二进制数据）。浏览器将把这些数据显示给用户。<br>注意，这里并没有指明针对该响应的请求类型，不过这对于服务器并不重要。客户端知道每种类型的请求将返回什么类型的数据，并决定如何使用这些数据。 </p>
<h2 class=title1>与HTTP相关类的简介</h2>
<h3 class=title2><a name=21></a>WebRequest类</h3>
<p><strong>WebRequest</strong> 是 .NET Framework 的用于访问 Internet 数据的请求/响应模型的抽象基类。使用该请求/响应模型的应用程序可以用协议不可知的方式从 Internet 请求数据。在这种方式下，应用程序处理 <strong>WebRequest</strong> 类的实例，而协议特定的子类则执行请求的具体细节。</p>
<p>请求从应用程序发送到某个特定的 URI，如服务器上的 Web 页。URI 从一个为应用程序注册的 <strong>WebRequest</strong> 子代列表中确定要创建的适当子类。注册 <strong>WebRequest</strong> 子代通常是为了处理某个特定的协议（如 HTTP 或 FTP），但是也可以注册它以处理对特定服务器或服务器上的路径的请求。</p>
<p>由于 <strong>WebRequest</strong> 类是一个抽象类，所以 <strong>WebRequest</strong> 实例在运行时的实际行为由 <a href="file:///D:/Documents/教学工作/C%23网络编程/课件/frlrfsystemnetwebrequestclasscreatetopic.htm"><u><font color=#0000ff>WebRequest.Create</font></u></a> 方法所返回的子类确定。</p>
<p><span class=emphtitle><strong class=le><font color=#ff0000>注意 </font></strong></span><span class=emph><em><font color=#0000ff>使用 <strong>Create</strong> 方法初始化新的 <strong>WebRequest</strong> 实例。不要使用 <strong>WebRequest</strong> 构造函数。</font></em></span></p>
<p>下面的示例说明如何创建 <strong>WebRequest</strong> 实例并返回响应。</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Initialize&nbsp;the&nbsp;WebRequest.</span><span style="COLOR: #008000"><br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">WebRequest&nbsp;myRequest&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;WebRequest.Create(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">http://www.contoso.com</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Return&nbsp;the&nbsp;response.&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">WebResponse&nbsp;myResponse&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;myRequest.GetResponse();<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Code&nbsp;to&nbsp;use&nbsp;the&nbsp;WebResponse&nbsp;goes&nbsp;here.<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Close&nbsp;the&nbsp;response&nbsp;to&nbsp;free&nbsp;resources.</span><span style="COLOR: #008000"><br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">myResponse.Close();</span></div>
<h3>WebResponse类</h3>
<p><strong>WebResponse</strong> 类是抽象（在 Visual Basic 中为 <strong>MustInherit</strong>）基类，协议特定的响应类从该抽象基类派生。应用程序可以使用 <strong>WebResponse</strong> 类的实例以协议不可知的方式参与请求和响应事务，而从 <strong>WebResponse</strong> 派生的协议特定的类携带请求的详细信息。</p>
<p>客户端应用程序不直接创建 <strong>WebResponse</strong> 对象，而是通过调用 <a href="file:///D:/Documents/教学工作/C%23网络编程/课件/frlrfsystemnetwebrequestclasstopic.htm"><u><font color=#0000ff>WebRequest</font></u></a> 实例上的 <a href="file:///D:/Documents/教学工作/C%23网络编程/课件/frlrfsystemnetwebrequestclassgetresponsetopic.htm"><u><font color=#0000ff>GetResponse</font></u></a> 方法来创建它。</p>
<p>下面的示例从 WebRequest 创建 WebResponse 实例。 <br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Initialize&nbsp;the&nbsp;WebRequest.</span><span style="COLOR: #008000"><br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">WebRequest&nbsp;myRequest&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;WebRequest.Create(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">http://www.contoso.com</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Return&nbsp;the&nbsp;response.&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">WebResponse&nbsp;myResponse&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;myRequest.GetResponse();<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Code&nbsp;to&nbsp;use&nbsp;the&nbsp;WebResponse&nbsp;goes&nbsp;here.<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Close&nbsp;the&nbsp;response&nbsp;to&nbsp;free&nbsp;resources.</span><span style="COLOR: #008000"><br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">myResponse.Close();</span></div>
<h3>HttpWebRequest类</h3>
<p><strong>HttpWebRequest</strong> 类对 <a href="http://www.teachblog.net/tangzz/archive/2006/11/30/3458.html#21"><u><font color=#800080>WebRequest</font></u></a> 中定义的属性和方法提供支持，也对使用户能够直接与使用 HTTP 的服务器交互的附加属性和方法提供支持。</p>
<p>不要使用 <a href="http://www.teachblog.net/tangzz/archive/2006/11/30/3458.html#23"><u><font color=#800080>HttpWebRequest</font></u></a> 构造函数。使用 <span class=emph><em><font color=#0000ff>WebRequest.Create</font></em></span> 方法初始化 <strong>HttpWebRequest</strong> 的一个新实例。如果 URI 的方案是 <code class=ce>http://</code> 或 <code class=ce>https://</code>，则 <strong>Create</strong> 将返回 <strong>HttpWebRequest</strong> 实例。</p>
<p><strong>GetResponse</strong> 方法向 <strong>RequestUri</strong> 属性中指定的 Internet 资源发出同步请求并返回包含该响应的 <a href="http://www.teachblog.net/tangzz/archive/2006/11/30/3458.html#24"><u><font color=#800080>HttpWebResponse</font></u></a> 实例。可以使用 <strong>BeginGetResponse</strong> 和 <strong>EndGetResponse</strong> 方法对 Internet 资源发出异步请求。</p>
<p>当要向 Internet 资源发送数据时，<strong>GetRequestStream</strong> 方法返回用于发送数据的Stream实例。<strong>BeginGetRequestStream</strong> 和 <strong>EndGetRequestStream</strong> 方法提供对发送数据流的异步访问。</p>
<p style="DISPLAY: block">下面的示例为 URI http://www.contoso.com/ 创建 <strong>HttpWebRequest</strong>。</p>
<pre class=code style="DISPLAY: block">
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">HttpWebRequest&nbsp;myReq&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(HttpWebRequest)WebRequest.Create(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">http://www.contoso.com/</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);</span></div>
</pre>
<h3><a name=24></a>HttpWebResponse类</h3>
<p>此类包含对 <a href="http://www.teachblog.net/tangzz/archive/2006/11/30/3458.html#22"><u><font color=#800080>WebResponse</font></u></a> 类中的属性和方法的 HTTP 特定用法的支持。<strong>HttpWebResponse</strong> 类用于生成发送 HTTP 请求和接收 HTTP 响应的 HTTP 独立客户端应用程序。</p>
<p><span class=emphtitle><strong><font color=#ff0000>注意：</font></strong></span><span class=emph><em><font color=#0000ff>不要混淆 <strong>HttpWebResponse</strong> 和 <strong>HttpResponse</strong>；后者用于 ASP.NET 应用程序，而且它的方法和属性是通过 ASP.NET 的内部 <strong>HttpResponse</strong> 对象公开的。</font></em></span></p>
<p>决不要直接创建 <strong>HttpWebResponse</strong> 类的实例。而应当使用通过调用 <span class=emph><em><font color=#0000ff>HttpWebRequest.GetResponse</font></em></span> 所返回的实例。</p>
<p>从 Internet 资源返回的公共标头信息公开为该类的属性。有关完整的列表，请参见下表。可以从 <a href="file:///D:/Documents/教学工作/C%23网络编程/课件/frlrfsystemnethttpwebresponseclassheaderstopic.htm"><u><font color=#0000ff>Headers</font></u></a> 属性以名称/值对的形式读取其他标头。</p>
<p>下表显示可以通过 <strong>HttpWebResponse</strong> 类的属性使用的公共 HTTP 标头。</p>
<div class=tablediv>
<table class=dtTABLE cellSpacing=0 width=600 border=1>
    <tbody>
        <tr vAlign=top>
            <th width="50%">标头</th>
            <th width="50%">属性</th>
        </tr>
        <tr vAlign=top>
            <td width="50%">
            <div align=center>Content-Encoding</div>
            </td>
            <td width="50%">
            <div align=center>ContentEncoding </div>
            </td>
        </tr>
        <tr vAlign=top>
            <td width="50%">
            <div align=center>Content-Length</div>
            </td>
            <td width="50%">
            <div align=center>ContentLength </div>
            </td>
        </tr>
        <tr vAlign=top>
            <td width="50%">
            <div align=center>Content-Type</div>
            </td>
            <td width="50%">
            <div align=center>ContentType </div>
            </td>
        </tr>
        <tr vAlign=top>
            <td width="50%">
            <div align=center>Last-Modified</div>
            </td>
            <td width="50%">
            <div align=center>LastModified </div>
            </td>
        </tr>
        <tr vAlign=top>
            <td width="50%">
            <div align=center>服务器</div>
            </td>
            <td width="50%">
            <div align=center>Server </div>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p>通过调用 <strong>GetResponseStream</strong> 方法，以 <strong>Stream</strong> 的形式返回来自 Internet 资源的响应的内容。</p>
<p style="DISPLAY: block">下面的示例返回 <a href="file:///D:/Documents/教学工作/C%23网络编程/课件/frlrfsystemnethttpwebrequestclasstopic.htm"><u><font color=#0000ff>HttpWebRequest</font></u></a> 的 <strong>HttpWebResponse</strong>：</p>
<pre class=code style="DISPLAY: block">
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">HttpWebRequest&nbsp;HttpWReq&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(HttpWebRequest)WebRequest.Create(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">http://www.contoso.com</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>HttpWebResponse&nbsp;HttpWResp&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(HttpWebResponse)HttpWReq.GetResponse();<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Insert&nbsp;code&nbsp;that&nbsp;uses&nbsp;the&nbsp;response&nbsp;object.</span><span style="COLOR: #008000"><br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">HttpWResp.Close()</span></div>
</pre>
<h3><a name=25></a><span class=title2>Uri类</span></h3>
<p>URI 是 Internet 上可由应用程序使用的资源的简洁表示形式。<strong>Uri</strong> 类定义了属性和方法来处理 URI，包括分析、比较和组合。<strong>Uri</strong> 类属性是只读的，修改 <strong>Uri</strong> 实例需使用 <strong>UriBuilder</strong> 类。</p>
<p><strong>Uri</strong> 类只存储绝对 URI（例如&#8220;http://www.contoso.com/index.htm&#8221;）。相对 URI（例如&#8220;/new/index.htm&#8221;）必须相对于基 URI 展开，这样才是绝对的。提供了 <strong>MakeRelative</strong> 方法在必要时将绝对 URI 转换为相对 URI。</p>
<p>URI 由转义编码存储为规范化 URI，所有 ASCII 值大于 127 的字符都被替换为它们的等效十六进制数。为使 URI 具有规范化格式，<strong>Uri</strong> 构造函数执行以下步骤。</p>
<ul type=disc>
    <li>将 URI 方案转换为小写。
    <li>将主机名转换为小写。
    <li>移除默认端口号和空端口号。
    <li>移除多余的段（如&#8220;/&#8221;和&#8220;/test&#8221;段）以简化 URI。 </li>
</ul>
<p>使用 <strong>ToString</strong> 方法，可以将 <strong>Uri</strong> 类的内容从转义编码的 URI 引用转换为可读的 URI 引用。</p>
<p>一些 URI 包括段标识符或查询。段标识符是 URI 中跟在数字符号 (#) 后的任何文本，存储在 <a href="file:///D:/Documents/教学工作/C%23网络编程/课件/frlrfsystemuriclassfragmenttopic.htm"><u><font color=#0000ff>Fragment</font></u></a> 属性中。查询信息是 URI 中跟在问号 (?) 后的任何文本，存储在 <strong>Query</strong> 属性中。</p>
<p><strong class=emphtitle><font color=#ff0000>注意：</font></strong><span class=emph><em><font color=#0000ff>URI 类支持使用以下格式的 IP 地址：四组表示法的 IPv4 协议和冒号分隔的十六进制 IPv6 协议。请记住在 IPv6 地址两边括上方括号，如 http://[::1]。</font></em></span></p>
<p style="DISPLAY: block">下面的示例创建 <strong>Uri</strong> 类的实例，并用它来创建 <a href="http://www.teachblog.net/tangzz/archive/2006/11/30/3458.html#21"><u><font color=#800080>WebRequest</font></u></a>。</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">Uri&nbsp;siteUri&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Uri(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">http://www.contoso.com/</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top>WebRequest&nbsp;wr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;WebRequest.Create(siteUri);<br><img src="http://www.teachblog.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<img src ="http://www.cnitblog.com/seeyeah/aggbug/48395.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2008-08-26 21:53 <a href="http://www.cnitblog.com/seeyeah/archive/2008/08/26/48395.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>