共用方式為


Uri.DnsSafeHost 屬性

定義

會取得一個主機名稱,必要時解除逃脫後,可以安全地用於 DNS 解析。

public:
 property System::String ^ DnsSafeHost { System::String ^ get(); };
public string DnsSafeHost { get; }
member this.DnsSafeHost : string
Public ReadOnly Property DnsSafeHost As String

屬性值

URI 的主機部分以適合 DNS 解析的格式呈現;或是原本的宿主字串,如果它已經適合解析。

例外狀況

此實例代表一個相對 URI,且此性質僅適用於絕對 URI。

範例

以下範例是從字串建立一個 Uri 實例。 它說明了從 Host回傳的值(URI 指定主機名稱或位址)與從 DnsSafeHost回傳的值(返回可在 DNS 解析中安全使用的位址)之間的差異。

// Create new Uri using a string address.
Uri address = new Uri("http://[fe80::200:39ff:fe36:1a2d%254]/temp/example.htm");

// Make the address DNS safe.

// The following outputs "[fe80::200:39ff:fe36:1a2d]".
Console.WriteLine(address.Host);

// The following outputs "fe80::200:39ff:fe36:1a2d%254".
Console.WriteLine(address.DnsSafeHost);
// Create new Uri using a string address.
let address = Uri "http://[fe80::200:39ff:fe36:1a2d%254]/temp/example.htm"

// Make the address DNS safe.

// The following outputs "[fe80::200:39ff:fe36:1a2d]".
printfn $"{address.Host}"

// The following outputs "fe80::200:39ff:fe36:1a2d%254".
printfn $"{address.DnsSafeHost}"
    ' Create new Uri using a string address.         
    Dim address As New Uri("http://[fe80::200:39ff:fe36:1a2d%254]/temp/example.htm")
    
    ' Make the address DNS safe. 
    ' The following outputs "[fe80::200:39ff:fe36:1a2d]".
    Console.WriteLine(address.Host)
    
    ' The following outputs "fe80::200:39ff:fe36:1a2d%254".
    Console.WriteLine(address.DnsSafeHost)

End Sub

如備註所述,解決主機名稱前先解除逃離。 你可以用這個 UnescapeDataString 方法來解除主機名稱的解脫,並且可以透過呼叫該 GetHostEntry 方法來解決它。

備註

對於 IPv6 位址,若建構時指定了括號([]),則會移除括號並 ScopeId 設定該屬性。

如果你用逃逸字串來構造這個實例(例如), "http://[fe80::200:39ff:fe36:1a2d%254]/temp/example.htm"那麼 DnsSafeHost 會回傳一個逃逸字串。 使用該字串進行 DNS 解析,將之前回傳 DnsSafeHost 的任何逃脫字串都恢復跳脫(見範例)。 如果你用了一個無效的非逃脫字串來構造這個實例(例如:「http://[fe80::200:39ff:fe36:1a2d%4]/temp/example.htm」),那麼 DnsSafeHost 會回傳一個未逃逸的字串。

DnsSafeHost 屬性依賴於 .NET Framework 應用程式中的設定設定,稍後將在此主題中討論。 IdnHost此屬性作為使用 DnsSafeHost的首選替代方案,因為 IdnHost 保證永遠對 DNS 安全。

DnsSafeHost 特性在 .NET Framework v3.5、3.0 SP1 及 2.0 SP1 中擴展,提供基於 RFC 3987 的國際資源識別碼(IRI)支援。 然而,為了確保應用程式與先前版本的相容性,您必須在 .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.configapp.config 檔案中完成。 例如,補充以下內容:

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

啟用 IDN 會將網域名稱中的所有 Unicode 標籤轉換成其 Punycode 對應項。 Punycode 名稱只包含 ASCII 字元,且一律以 xn-- 前置詞開頭。 這是因為支援因特網上現有的 DNS 伺服器,因為大多數 DNS 伺服器只支援 ASCII 字元(請參閱 RFC 3940)。

啟用 IDN 只會影響房產 DnsSafeHost 的價值。

根據所使用的 DNS 伺服器而定,IDN 有三個可能的值:

  • IDN 已啟用 = 全部

    此值將將任何 Unicode 網域名稱轉換為其 Punycode 等價物(IDN 名稱)。

  • idn 啟用 = AllExceptIntranet (全部允許但內部網路例外)

    此值將將所有外部 Unicode 網域名稱轉換為 Punycode 等價物(IDN 名稱)。 在這種情況下,為了處理本地內聯網的國際名稱,內聯網所用的 DNS 伺服器應該支援 Unicode 名稱。

  • idn 啟用狀態 = 不啟用

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

啟用 IRI 解析(iriParsing enabled = true)會依照 RFC 3987 中的 IRI 規則進行字元正規化與檢查。 預設值為 false ,並根據 RFC 2396 和 RFC 2732(針對 IPv6 字面量)標準化並檢查字元。

欲了解更多關於IRI支援的資訊,請參閱該 Uri 課程備註區。

適用於