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 : boolPublic 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 和 Host 标头根据请求中提供的信息创建转换后的 URI,以确定要将请求转发到的源服务器。 这种判断是通过将请求中的信息与一组已注册的 URI 前缀进行比较做出的。 HTTP 服务器 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 随后会尝试将 URL 解码为 ANSI 或 DBCS。如果为零(并且 EnableNonUTF8 不为零),则 http.sys会尝试将 URL 解码为 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 而不是转换http.sys后的 URI 作为属性的Url输入。