我一直在追踪 URL 重写应用程序上的错误。该错误表现为查询字符串中某些变音符号的编码问题。
基本上,问题是基本上 /search.aspx?search=heřmánek 的请求被“search=he%c5%99m%c3%a1nek”的查询字符串重写
正确的值(使用一些不同的工作代码)是将查询字符串重写为“search=he%u0159m%u00e1nek”
注意两个字符串之间的区别。但是,如果您同时发布这两个内容,您将看到 Url Encoding 再现相同的字符串。直到您使用 context.Rewrite 函数,编码才会中断。损坏的字符串返回“heÅmánek”(使用 Request.QueryString["Search"],工作字符串返回“heřmánek”。此更改发生在调用重写函数之后。
我将其追溯到一组使用 Request.QueryString (工作)的代码,另一组使用 Request.Url.Query (request.Url 返回一个 Uri 实例)。
虽然我已经解决了这个错误,但我的理解中存在一个漏洞,所以如果有人知道其中的区别,我就准备好上课了。
你的问题确实激发了我的兴趣,所以我在过去一个小时左右的时间里读了一些书。我并不绝对肯定我已经找到了答案,但我会把它扔在那里看看你的想法。
从我到目前为止所读到的内容来看,Request.QueryString 实际上是“ServerVariables 集合中 QUERY_STRING 变量的解析版本”[参考] http://msdn.microsoft.com/en-us/library/ms524784.aspx,其中 Request.Url 是(如您所述)封装在 Uri 对象中的原始 URL。根据本文 http://msdn.microsoft.com/en-us/library/aa332621(VS.71).aspx,Uri 类的构造函数“...解析 [url 字符串],将其置于规范格式,并进行任何所需的转义编码。”
因此,Request.QueryString 似乎使用不同的函数来解析 ServerVariables 构造函数中的“QUERY_STRING”变量。这可以解释为什么您会看到两者之间的差异。现在,为什么自定义解析函数和Uri对象的解析函数使用不同的编码方式,完全超出了我的理解。也许更熟悉 aspnet_isapi DLL 的人可以为这个问题提供一些答案。
无论如何,希望我的帖子有意义。顺便说一句,我想添加另一个参考资料,它也提供了一些非常彻底和有趣的阅读:http://download.microsoft.com/download/6/c/a/6ca715c5-2095-4eec-a56f-a5ee904a1387/Ch-12_HTTP_Request_Context.pdf http://download.microsoft.com/download/6/c/a/6ca715c5-2095-4eec-a56f-a5ee904a1387/Ch-12_HTTP_Request_Context.pdf
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)