Uri.DnsSafeHost 属性

定义

获得可安全用于 DNS 解析的未转义主机名(如必要)。

C#
public string DnsSafeHost { get; }

属性值

String

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

例外

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

示例

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

C#
// 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);

如“备注”中所述,在解析主机名之前取消设置主机名。 可以使用该方法 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 文件中完成。 例如,添加以下内容:

    XML
    <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 “备注”部分。

适用于

产品 版本
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0