2

当查询字符串是 UrlEncoded 或在 ASP.NET 中有百分比字符时,如何从 Request 对象中获取实际的查询字符串?

基本上,如果我有这样的 Url: Default.aspx?p=%b4,我如何获得一个填充有“%b4”的字符串?

Request.QueryString["p"]返回一个不可打印的字符。

Request.RawUrl返回 Default.aspx?p=%ufffd"

Request.Url.AbsoluteUri返回 Default.aspx?p=%EF%BF%BD

我怎样才能找回“%b4”?

4

4 回答 4

4

我对此进行了进一步研究,并相信我知道是什么原因造成的:HTTP 客户端正在向服务器提交一个 URL 编码不正确的 URL。具体来说,URL 中有无效字符。

要复制,请将 URL 末尾的以下内容粘贴到 IE8 中:default.aspx?p=´

如果您检查通过线路传输的字节(例如使用Fiddler),您会看到实际的十六进制 B4 字符正在 URL 中从客户端发送到服务器。这是 URL 中的非法字符,因为 URL 仅限于 0x80 以下的字符代码(任何大于 0x80 的字符代码都必须进行百分比转义)。

因此,您的客户端传入了一个无效字符,并且您的服务器正在(正确地)用 %EF%BF%BD 替换虚假字符,这是Unicode 替换字符 (U+0FFD)的 UTF-8 编码,这就是发生的情况当遇到在本地编码中没有等效的字符时。

AFAIK,这是 IE 中的一个错误。如果您在 Firefox 中键入相同的 URL,Firefox 将正确地对 URL 进行编码(作为 %b4 而不是 ´)。请注意,同样 AFAIK,仅当手动将无效字符粘贴到 IE 的地址栏中时才会出现问题——如果链接中存在相同的字符,则 IE 似乎正确编码了 URL(至少在我测试的情况下)。

所以你应该弄清楚是谁向你发送了这个虚假的 URL,并告诉他们开始正确编码他们的 URL!

于 2009-10-28T16:52:05.887 回答
1

当您执行 Request.Querystring["key"] 时,Asp.net 会自动对内容进行 URL 解码。您只需要再次对其进行编码。

HttpUtility.UrlEncode(Request.QueryString["p"])
于 2009-10-28T18:03:53.667 回答
0
HttpContext.Current.Request.ServerVariables["QUERY_STRING"]

将返回 RAW 查询字符串

于 2009-10-28T17:44:25.360 回答
0

我有同样的问题。我只是通过在构建查询字符串时添加 javascript "escape('text % text')" 来解决它!

于 2014-03-27T12:48:09.773 回答