System 命名空間


.NET Framework 類別庫
Uri 類別

更新:2007 年 11 月

提供統一資源識別元 (URI) 的物件表示,以及對 URI 各部分的簡易存取。

命名空間:  System
組件:  System (在 System.dll 中)
語法

Visual Basic (宣告)
<SerializableAttribute> _
<TypeConverterAttribute(GetType(UriTypeConverter))> _
Public Class Uri _
    Implements ISerializable
Visual Basic (使用方式)
Dim instance As Uri
C#
[SerializableAttribute]
[TypeConverterAttribute(typeof(UriTypeConverter))]
public class Uri : ISerializable
Visual C++
[SerializableAttribute]
[TypeConverterAttribute(typeof(UriTypeConverter))]
public ref class Uri : ISerializable
J#
/** @attribute SerializableAttribute */ 
/** @attribute TypeConverterAttribute(UriTypeConverter) */
public class Uri implements ISerializable
JScript
public class Uri implements ISerializable
備註

URI 是您的應用程式在內部網路或網際網路上可以使用的資源壓縮表示。Uri 類別定義用來處理 URI 的屬性和方法,包括剖析、比較和組合。Uri 類別屬性是唯讀的,若要建立可修改的物件,請使用 UriBuilder 類別。

相對 URI (例如,"/new/index.htm") 必須根據基底 URI 展開,才能成為絕對的 URI。提供 MakeRelative 方法,以便在必要時將絕對 URI 轉換成相對 URI。

如果字串是語式正確的 URI,包括配置識別項,則 Uri 建構函式不會逸出 URI 字串。

Uri 屬性會以逸出編碼方式傳回標準資料表示,其中所有大於 127 的 Unicode 值的字元都會取代成對等的十六進位字元。為了讓 URI 具有標準格式,Uri 建構函式會執行下列步驟:

  • 將 URI 配置轉換成小寫。

  • 將主機名稱轉換成小寫。

  • 如果主機名稱是 IPv6 位址,則會使用標準 IPv6 位址,並移除 ScopeId 和其他選擇性 IPv6 資料。

  • 移除預設的和空的連接埠編號。

  • 壓縮序列,例如 /./、/../、//,包括逸出表示,以規範化階層式 URI 的路徑。請注意,部分配置不會壓縮其逸出表示。

  • 對於階層式 URI,如果主機結尾不是斜線 (/),則會加上斜線。

  • 依照 RFC 2396,逸出 URI 中的任何保留字元。

逸出表示因為屬於某些配置之建構函式 (Constructor) 規範化的一部分,所以可以進行壓縮。URI 會壓縮逸出序列的配置包括下列項目:file、http、https、net.pipe 和 net.tcp。至於其他所有配置,則不會壓縮逸出序列。例如:如果您以百分比將兩點 ".." 編碼為 "%2E%2E",則 URI 建構函式會針對部分配置壓縮這個序列。例如,下列程式碼範例顯示 http 配置的 URI 建構函式。

    Uri uri = new Uri("http://myUrl/%2E%2E/%2E%2E");
    Console.WriteLine(uri.AbsoluteUri);
    Console.WriteLine(uri.PathAndQuery);

執行這個程式碼時,會傳回下列已壓縮逸出序列的輸出。

http://myUrl/
/

下列程式碼範例顯示 ftp 配置的 URI 建構函式:

    Uri uri = new Uri("ftp://myUrl/%2E%2E/%2E%2E");
    Console.WriteLine(uri.AbsoluteUri);
    Console.WriteLine(uri.PathAndQuery);

執行這個程式碼時,會傳回下列未壓縮逸出序列的輸出。

ftp://myUrl/%2E%2E/%2E%2E
/%2E%2E/%2E%2E

您可以使用 ToString 方法,將 Uri 類別的內容從採取逸出編碼的 URI 參考,轉換成可以讀取的 URI 參考。請注意,在 ToString 方法的輸出中,仍會逸出部分保留字元。這是為了支援從 ToString 傳回值非模稜兩可地重新建構 URI。

有些 URI 包括片段識別項、查詢或兩者。片段識別項是數字符號 (#) 後面的任何文字 (不含數字符號),而片段文字會儲存於 Fragment 屬性中。查詢資訊就是 URI 中問號 (?) 之後的所有文字,查循文字則儲存在 Query 屬性中。

在 .NET Framework 1.1 中,如果指定給建構函式的字串包含未知的配置和 "c:\",則 Uri 類別會在冒號後面插入 "//"。例如,URI xyz:c:\abc 會轉換成 xyz://c:/abc。在 .NET Framework 2.0 中,這個行為已移除,以上的範例字串會轉換成 xyz:c:/abc

txt7706a.alert_note(zh-tw,VS.90).gif注意事項:

URI 類別支援採行 IPv4 通訊協定的四個數字標記法和 IPv6 通訊協定的冒號分隔十六進位標記法的 IP 位址用法。請記得要將 IPv6 位址置於方括弧之內,如 http://[::1]。

國際資源識別項支援

一般用來表示網站位址的統一資源識別元是由極有限的一組字元組成:

  • 英文字母的大小寫 ASCII 字母。

  • 0 到 9 的數字。

  • 少部分的其他 ASCII 符號。

URI 規格記載在網際網路工程任務推動小組 (Internet Engineering Task Force,(IETF)) 發行的 RFC 2396 和 RFC 3986 中。

隨著網際網路的成長,使用非英文語言來識別資源的需求也跟著增加。而簡化這個需求並允許非 ASCII 字元 (Unicode/ISO 10646 字元集中的字元集 (Character Set)) 的識別項稱為「國際資源識別項」(International Resource Identifier,IRI)。IRI 規格記載在 IETF 發行的 RFC 3987 中。使用 IRI 可以讓 URL 包含 Unicode 字元。

在 .NET Framework v3.5、3.0 SP1 和 2.0 SP1 中,已擴充現有的 Uri 類別,以根據 RFC 3987 提供 IRI 支援。除非特別啟用 IRI,否則目前的使用者並不會看到 .NET Framework 2.0 的行為有任何變化。這可確保應用程式與舊版 .NET Framework 的相容性。

若要啟用 IRI 的支援,則需要進行下列兩項變更:

  1. 將下行加入 .NET Framework 2.0 目錄的 machine.config 檔案中

    <section name="uri" type="System.Configuration.UriSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  2. 指定是否要對網域名稱套用國際化網域名稱 (IDN) 剖析,以及是否應該套用 IRI 剖析規則。這項變更可以在 machine.config 或 app.config 檔案中進行。例如,加入下列各行:

    <configuration>
      <uri>
      <idn enabled="All" />
      <iriParsing enabled="true" />
      </uri>
    </configuration>

啟用 IDN 會將網域名稱內的所有 Unicode 標籤 (Label) 轉換成 Punycode 的對等名稱。Punycode 名稱只包含 ASCII 字元,且開頭一律為 xn-- 前置字元。這麼做的原因是要支援網際網路上現有的 DNS 伺服器,因為大多數的 DNS 伺服器僅支援 ASCII 字元 (請參閱 RFC 3940)。

啟用 IRI 和 IDN 會影響 Uri..::.DnsSafeHost 屬性的值。啟用 IRI 和 IDN 也會變更 EqualsOriginalStringGetComponentsIsWellFormedOriginalString 方法的行為。

根據使用的 DNS 伺服器,IDN 有三種可能值:

  • idn enabled = All

    這個值會將任何 Unicode 網域名稱轉換成 Punycode 的對等名稱 (IDN 名稱)。

  • idn enabled = AllExceptIntranet

    這個值會將所有不位於近端內部網路的 Unicode 網域名稱轉換為使用 Punycode 的對等名稱 (IDN 名稱)。此例中,若要在近端內部網路上處理國際性名稱,則用於內部網路的 DNS 伺服器應該支援 Unicode 名稱解析。

  • idn enabled = None

    這個值不會轉換任何 Unicode 網域名稱即可使用 Punycode。這是預設值,與 .NET Framework 2.0 的行為一致。

啟用 IRI 剖析 (iriParsing enabled = true) 會根據 RFC 3987 中最新的 IRI 規則執行正規化和字元檢查。預設值為 false,並且會根據 RFC 2396 和 RFC 3986 (適用於 IPv6 常值) 執行正規化和字元檢查。

Uri 類別中的 IRI 和 IDN 處理也可以使用 System.Configuration..::.IriParsingElementSystem.Configuration..::.IdnElementSystem.Configuration..::.UriSection 組態設定類別進行控制。System.Configuration..::.IriParsingElement 設定可啟用或停用 Uri 類別中的 IRI 處理。System.Configuration..::.IdnElement 設定則可啟用或停用 Uri 類別中的 IDN 處理。System.Configuration..::.IriParsingElement 設定也可間接控制 IDN。必須啟用 IRI 處理,才能執行 IDN 處理。如果停用了 IRI 處理,則 IDN 處理會設定為預設設定,此時為考量相容性會使用 .NET Framework 2.0 的行為,且不會使用 IDN 名稱。

建構第一個 System..::.Uri 類別時,會讀取一次 System.Configuration..::.IriParsingElementSystem.Configuration..::.IdnElement 的組態設定。過了這個時間之後,對組態設定所做的變更都會被忽略。

也已擴充 System..::.GenericUriParser 類別,允許建立支援 IRI 和 IDN 的可自訂剖析器 (Parser)。將 System..::.GenericUriParserOptions 列舉型別 (Enumeration) 中可用值的位元 (Bitwise) 組合傳遞給 System..::.GenericUriParser 建構函式,就可以指定 System..::.GenericUriParser 物件的行為。GenericUriParserOptions..::.IriParsing 型別表示剖析器支援在 RFC 3987 中,針對國際資源識別元 (IRI) 指定的剖析規則。是否使用 IRI 是透過先前討論過的組態值所指定。

GenericUriParserOptions..::.Idn 型別表示剖析器支援國際化網域名稱 (IDN) 剖析主機名稱的 (IDN)。是否使用 IDN 是透過先前討論過的組態值所指定。

效能考量

如果您使用包含 URI 的 Web.config 檔初始化應用程式,而 URI 的配置識別項非標準時,處理 URI 會需要額外時間。在這個狀況下,當需要 URI 時,而不是啟動時,請初始化應用程式受影響的組件。

呼叫者注意事項

基於安全考量,應用程式在接受來自未受信任來源的 Uri 執行個體時應該要特別小心,並且將 dontEscape 設定為 true。您可以呼叫 IsWellFormedOriginalString 方法來檢查 URI 字串的有效性。

Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows CE 平台注意事項:

.NET Compact Framework 不會分辨相對和絕對路徑。此外,在處理以 file:// 為字首的 URI 字串配置時,.NET Compact Framework 的作法與完整版 .NET Framework 是不同的。它會將相對的 file://myfile 規格解析成 \\myfile。使用 file:///myfile (三條斜線) 會在根目錄中解析為 \myfile。為了相關作業能順利執行,請指定絕對路徑資訊。

範例

下列範例會建立 Uri 類別的執行個體,並用它來建立 WebRequest 執行個體。

Visual Basic
Dim siteUri As New Uri("http://www.contoso.com/")

Dim wr As WebRequest = WebRequest.Create(siteUri)

C#
Uri siteUri = new Uri("http://www.contoso.com/");

WebRequest wr = WebRequest.Create(siteUri);

Visual C++
Uri^ siteUri = gcnew Uri( "http://www.contoso.com/" );
WebRequest^ wr = WebRequest::Create( siteUri );
J#
Uri siteUri = new Uri("http://www.contoso.com/");
WebRequest wr = WebRequest.Create(siteUri);
JScript
var siteUri : Uri = new Uri("http://www.contoso.com/");
var wr : WebRequest = WebRequest.Create(siteUri);

繼承階層架構

System..::.Object
  System..::.Uri
執行緒安全

這個型別的任何 Public static (在 Visual Basic 中為 Shared) 成員都具備執行緒安全。並非所有的執行個體成員都是安全執行緒。
平台

Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile for Smartphone, Windows Mobile for Pocket PC, Xbox 360

.NET Framework 和 .NET Compact Framework 並不支援各種平台的所有版本。如需支援平台版本的相關資訊,請參閱 .NET Framework 系統需求
版本資訊

.NET Framework

支援版本:3.5、3.0、2.0、1.1、1.0

.NET Compact Framework

支援版本:3.5、2.0、1.0

XNA Framework

支援版本:2.0、1.0
請參閱

參考

標記 :


Page view tracker