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 和 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输入。