<httpListener> 要素 (ネットワーク設定)

HttpListener クラスで使用されるパラメーターをカスタマイズします。

<httpListener
  unescapeRequestUrl ="true|false"
/>

属性および要素

以降のセクションでは、属性、子要素、および親要素について説明します。

属性

属性

説明

unescapeRequestUrl

HttpListener インスタンスが変換された URI ではなくエスケープされていない生の URI を使用するかどうかを示すブール値。

子要素

なし。

親要素

要素

説明

<settings>

System.Net 名前空間の基本的なネットワーク オプションを構成します。

解説

unescapeRequestUrl 属性は、変換された URI ではなくエスケープされていない生の URI を HttpListener で使用するかどうかを示します。変換された URI では、パーセント記号をエンコードした値はすべて変換され、その他の正規化手順が実行されます。

HttpListener インスタンスは http.sys サービスを通じて要求を受け取ると、http.sys から渡された URI 文字列のインスタンスを作成し、そのインスタンスを HttpListenerRequest.Url プロパティとして公開します。

http.sys サービスでは、次の 2 つの要求 URI 文字列を公開します。

  • 生の URI

  • 変換された URI

生の URI は、HTTP 要求の要求行に指定されている System.Uri です。

GET /path/

Host: www.contoso.com

前の要求の http.sys から渡される生の URI は、"/path/" です。 これは、ネットワーク上で送信された HTTP 動詞の後に続く文字列を表します。

http.sys サービスでは、HTTP 要求行および Host ヘッダーに指定されている URI を使用して要求の転送先となる元のサーバーを特定することによって、要求に指定されている情報から、変換された URI を作成します。 この処理は、要求の情報と一連の登録済み URI プレフィックスとを比較することで行われます。 HTTP Server SDK のドキュメントでは、この変換された URI を HTTP_COOKED_URL 構造体と呼びます。

要求と登録済み URI プレフィックスとを比較できるようにするためには、要求の正規化をいくつか行う必要があります。 上のサンプルでは、変換された URI は次のようになります。

https://www.contoso.com/path/

http.sys サービスでは、Uri.Host プロパティ値と要求行の文字列を結合して、変換された URI を作成します。 また、http.sys と System.Uri クラスでは、次の処理も行います。

  • パーセント記号をエンコードしたすべての値のエスケープを解除します。

  • パーセント記号をエンコードした非 ASCII 文字を UTF-16 文字表現に変換します。 UTF-8 文字および ANSI/DBCS 文字も Unicode 文字 (%uXXXX 形式を使用した Unicode エンコーディング) と同様にサポートされることに注意してください。

  • パスの圧縮など、その他の正規化手順を実行します。

パーセント記号をエンコードした値に使用されているエンコーディングに関する情報は要求に含まれていないため、パーセント記号をエンコードした値を解析するだけでは、正しいエンコーディングを判断できない場合があります。

そのため、http.sys には、次に示すように、この処理を変更するためのレジストリ キーが 2 つ用意されています。

レジストリ キー

既定値

説明

EnableNonUTF8

1

ゼロの場合、http.sys は UTF-8 エンコードの URL のみ受け入れます。

ゼロ以外の場合、http.sys は要求で ANSI エンコードの URL または DBCS エンコードの URL も受け入れます。

FavorUTF8

1

ゼロ以外の場合、http.sys は常に最初に URL を UTF-8 としてデコードしようとします。その変換が失敗した場合、EnableNonUTF8 がゼロ以外のときは、ANSI または DBCS としてデコードしようとします。

ゼロ (かつ EnableNonUTF8 がゼロ以外) の場合、http.sys は URL を ANSI または DBCS としてデコードしようとします。失敗した場合は、UTF-8 変換を試行します。

HttpListener は要求を受け取ると、http.sys からの変換された URI を Url プロパティへの入力として使用します。

URI では文字と数字以外の文字 (記号など) をサポートする必要があります。 例を次に示します。この URI は、顧客番号 "1/3812" の顧客情報を取得するために使用するものです。

https://www.contoso.com/Customer('1%2F3812')/

Uri のパーセント記号をエンコードしたスラッシュに注目してください (%2F)。 この場合、スラッシュ文字はデータを表し、パス区切り記号ではないため、この処理は必要です。

この文字列をそのまま Uri コンストラクターに渡すと、次の URI になります。

https://www.contoso.com/Customer('1/3812')/

パスはセグメントに分割され、次の要素になります。

Customer('1

3812')

これでは、要求の送信元の意図とは異なります。

unescapeRequestUrl 属性が false に設定されている場合、HttpListener は要求を受け取ると、http.sys からの変換された URI ではなく生の URI を Url プロパティへの入力として使用します。

unescapeRequestUrl 属性の既定値は true です。

UnescapeRequestUrl プロパティを使用すると、適用可能な構成ファイルから unescapeRequestUrl 属性の現在の値を取得できます。

使用例

要求を受け取ったときに、http.sys からの変換された URI ではなく生の URI を Url プロパティへの入力として使用するように、HttpListener クラスを構成する方法を次のコード例に示します。

<configuration>
  <system.net>
    <settings>
      <httpListener
        unescapeRequestUrl="false"
      />
    </settings>
  </system.net>
</configuration>

要素情報

名前空間

System.Net

スキーマ名

検証ファイル

空も使用できる

参照

参照

ネットワーク設定スキーマ

HttpListenerElement

HttpListener

Url