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

属性值

String

URI 的主机部分,采用适用于 DNS 解析的格式;或原始主机字符串(如果已适合解析)。

例外

此实例代表一个相对 URI,而此属性仅对绝对 URI 有效。

示例

以下示例从字符串创建 Uri 实例。 它说明了从 Host中返回的值之间的差异,该值返回 URI 中指定的主机名或地址,以及从 DnsSafeHost中返回的值,该值返回一个在 DNS 解析中安全使用的地址。

// Create new Uri using a string address.         
Uri^ address = gcnew 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.
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-- 前缀开头。 这样是为了支持 Internet 上的 DNS 服务器,因为大部分 DNS 服务器仅支持 ASCII 字符(参见 RFC 3940)。

启用 IDN 只会影响 DnsSafeHost 属性值。

根据所用的 DNS 服务器,IDN 有三个可能的值:

  • idn enabled = All

    此值会将所有 Unicode 域名转换为它们的 Punycode 等效项(IDN 名称)。

  • idn enabled = AllExceptIntranet

    此值会将所有外部 Unicode 域名转换为使用 Punycode 等效项(IDN 名称)。 在这种情况下,若要处理本地 Intranet 上的国际化名称,用于 Intranet 的 DNS 服务器应该支持 Unicode 名称。

  • idn enabled = None

    此值不会将任何 Unicode 域名转换为使用 Punycode。 这是默认值,与 .NET Framework 2.0 行为一致。

启用 IRI 分析 (已启用 iriParsing = true) 根据 RFC 3987 中的 IRI 规则规范化和检查字符。 默认值根据 false RFC 2396 和 RFC 2732 (iPv6 文本) 规范化和检查字符。

有关 IRI 支持的详细信息,请参阅类的 Uri “备注”部分。

适用于