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

DNS 解決に適した形式の URI のホスト部分。解決に既に適している場合は、元のホスト文字列。

例外

このインスタンスは相対 URI を表します。このプロパティは、絶対 URI でのみ有効です。

次の例では、 Uri 文字列からインスタンスを作成します。 URI で指定されたホスト名またはアドレスを返す、返される Host値と、DNS 解決で安全に使用できるアドレスを返す返される DnsSafeHost値の違いを示します。

// 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、常に DNS セーフであることが保証されているためIdnHost、使用DnsSafeHostする代わりに使用することをお勧めします。

このプロパティはDnsSafeHost、RFC 3987 に基づく国際リソース識別子 (IRI) のサポートを提供するために、.NET Framework v3.5、3.0 SP1、および 2.0 SP1 で拡張されました。 ただし、以前のバージョンとのアプリケーションの互換性を確保するには、.NET Framework アプリで特に有効にする必要があります。 IRI のサポートを有効にするには、次の 2 つの変更が必要です。

  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 ラベルが、対応する Punycode に変換されます。 Punycode 名には ASCII 文字のみが含まれ、常に xn-- プレフィックスで始まります。 この理由は、ほとんどの DNS サーバーは ASCII 文字しかサポートしていないため、インターネットで既存の DNS サーバーをサポートするためです (RFC 3940 を参照)。

IDN を有効にすると、プロパティの値にのみ影響します DnsSafeHost

IDN には、使用する DNS サーバーに応じて、次の 3 つの値を指定できます。

  • 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 規則に従って文字が正規化およびチェックされます。 既定値は RFC false 2396 および RFC 2732 (IPv6 リテラルの場合) に従って文字を正規化およびチェックします。

IRI サポートの詳細については、クラスの「解説」セクションを Uri 参照してください。

適用対象