HttpListenerElement.UnescapeRequestUrl 屬性
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
取得值,這個值會指出 HttpListener 使用原始未逸出 URI,而非轉換的 URI。
public:
property bool UnescapeRequestUrl { bool get(); };
[System.Configuration.ConfigurationProperty("unescapeRequestUrl", DefaultValue=true, IsRequired=false)]
public bool UnescapeRequestUrl { get; }
[<System.Configuration.ConfigurationProperty("unescapeRequestUrl", DefaultValue=true, IsRequired=false)>]
member this.UnescapeRequestUrl : bool
Public ReadOnly Property UnescapeRequestUrl As Boolean
屬性值
布林值,指出 HttpListener 使用原始未逸出 URI,而非轉換的 URI。
- 屬性
備註
屬性 UnescapeRequestUrl 會指出是否 HttpListener 使用未經處理的 URI,而不是轉換的 URI,其中會轉換任何百分比編碼值,並採取其他正規化步驟。
當 HttpListener 執行個體透過 http.sys
服務收到要求時,即會建立 http.sys
所提供的 URI 字串執行個體,並將其公開為 HttpListenerRequest.Url 屬性。
http.sys
服務會公開兩個要求 URI 字串:
原始 URI
轉換的 URI
原始 URI 是 HTTP 要求之要求行中提供的 System.Uri:
GET /path/
Host: www.contoso.com
http.sys
針對上述要求所提供的原始 URI 為 "/path/"。 這表示字串後面會接著 HTTP 動詞命令,因為這是透過網路傳送。
http.sys
服務會使用 HTTP 要求行中提供的 URI 和主機標頭來判斷應轉送要求的目標原始伺服器,以從要求中提供的資訊建立轉換的 URI。 這可藉由比較來自要求的資訊與一組已註冊的 URI 首碼來完成。 HTTP Server SDK 檔案將這個已轉換的 URI 稱為 HTTP_COOKED_URL 結構。
若要能夠比較要求與已註冊的 URI 首碼,需要對要求進行一些正規化。 在上述範例中,轉換的 URI 如下所示:
http://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
提供兩個登錄機碼來修改此流程:
登錄金鑰 | 預設值 | 描述 |
---|---|---|
EnableNonUTF8 | 1 | 如果為零,http.sys 只會接受 UTF-8 編碼的 URL。如果為非零, http.sys 也會接受要求中 ANSI 或 DBCS 編碼的 URL。 |
FavorUTF8 | 1 | 如果為非零,http.sys 一律會先嘗試將 URL 解碼為 UTF-8;如果該轉換失敗且 EnableNonUTF8 為非零,Http.sys 會接著嘗試將其解碼為 ANSI 或 DBCS。如果為零 (且 EnableNonUTF8 為非零), http.sys 會嘗試將其解碼為 ANSI 或 DBCS;如果失敗,則會嘗試進行 UTF-8 轉換。 |
當 HttpListener 收到要求時,即會使用從 http.sys
轉換的 URI 作為 Url 屬性的輸入。
除了 URI 中的字元和數字之外,還需要支援字元。 例如,下列 URI 可用來擷取客戶編號 "1/3812" 的客戶資訊:
http://www.contoso.com/Customer('1%2F3812')/
請注意 Uri (%2F) 中的百分比編碼斜線。 這是必要的,因為在此情況下,斜線字元代表資料,而不是路徑分隔符號。
將字串傳遞至 URI 建構函式會導致下列 URI:
http://www.contoso.com/Customer('1/3812')/
將路徑分段會產生下列元素:
Customer('1
3812')
這不是要求傳送者想要的。
UnescapeRequestUrl如果屬性設定為 false,則當 收到要求時HttpListener,它會使用原始 URI,而不是將轉換的 URI 作為http.sys
屬性的Url輸入。