如何在URLEncoded或ASP.NET中具有百分比字符时获取查询字符串

当查询字符串是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”?

我进一步深入研究,并相信我知道是什么导致了这一点:HTTP客户端正在向服务器提交一个URL,该URL没有经过正确的URL编码。 具体来说,URL中存在无效字符。

要重新登录,请将url末尾的以下内容粘贴到IE8中: default.aspx?p=´

如果你检查通过网络传输的字节数(例如使用Fiddler ),你会看到一个实际的Hex 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!

当你执行Request.Querystring [“key”]时,Asp.net会自动对URL解码。 你只需要再次编码。

 HttpUtility.UrlEncode(Request.QueryString["p"]) 
 HttpContext.Current.Request.ServerVariables["QUERY_STRING"] 

将返回RAW查询字符串

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