Uri.DnsSafeHost 屬性
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
會取得一個主機名稱,必要時解除逃脫後,可以安全地用於 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 的支援,需要進行以下兩項變更:
在 .NET Framework 2.0 目錄下的 machine.config 檔案中新增以下行:
\<section name="uri" type="System.Configuration.UriSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />請指定是否要對網域名套用國際化網域名稱(IDN)解析,以及是否應套用 IRI 解析規則。 這可以在 machine.config 或 app.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 課程備註區。