AHM*_*AHM 8 c# asp.net encoding http query-string
我试图从asp.net应用程序发送请求到这样的"http://mysite.dk/tværs?test=æ"的URL,并且我无法正确编码查询字符串.或者可能正确编码了查询字符串,我连接的服务只是无法正确理解.
我试图用不同的浏览器发送请求并记录他们如何使用Wireshark对请求进行编码,我得到了以下结果:
Firefox: http://mysite.dk/tv%C3%A6rs?test=%E6 Ie8: http://mysite.dk/tv%C3%A6rs?test=\xe6 Curl: http://mysite.dk/tv\xe6rs?test=\xe6
Firefox,IE和Curl都会从服务中获得正确的结果.请注意,它们在查询字符串中以不同方式编码丹麦特殊字符'æ'.
当我使用HttpWebRequest从我的asp.net应用程序发送请求时,URL以这种方式编码:
http://mysite.dk/tv%C3%A6rs?test=%C3%A6
它以与url的路径部分相同的方式对查询字符串进行编码.远程服务不理解这种编码,所以我得不到正确的答案.
记录中,'æ'(U + 00E6)是ISO-LATIN-1中的%E6,以及UTF-8中的%C3%A6.
我可以更改远程服务以接受UTF-8编码的查询字符串,但随后该服务将停止在浏览器中工作,我对此并不感兴趣.有没有办法指定.NET不应该使用UTF-8编码查询字符串?
我正在创建这样的webrequest:
var req = WebRequest.Create("http://mysite.dk/tværs?test=æ") as HttpWebRequest;
Run Code Online (Sandbox Code Playgroud)
但问题似乎来自System.Uri,它显然是在WebRequest.Create中使用的:
var uri = new Uri("http://mysite.dk/tværs?test=æ");
// now uri.AbsolutePath == "http://mysite.dk/tv%C3%A6rs?test=%C3%A6"
Run Code Online (Sandbox Code Playgroud)
看起来您在整个网址上应用了UrlEncode - 这是不正确的,路径和查询字符串的编码方式与您所见的不同.什么在进行URI的编码,WebRequest?
您可以手动建立使用各部分UriBuilder,或手动编码使用UrlPathEncode的路径,并以UrlEncode的查询字符串名称和值.
编辑:
如果问题在于路径,而不是查询字符串,您可以尝试通过web.config 启用IRI支持
<configuration>
<uri>
<iriParsing enabled="true" />
</uri>
</configuration>
Run Code Online (Sandbox Code Playgroud)
那应该让国际角色独自留在路上.
我最终更改了远程 Web 服务以期望查询字符串采用 UTF-8 编码。它解决了我眼前的问题,PHP 和 .NET 框架都无法正确调用 Web 服务。
\n\n然而,现在浏览器中的行为很奇怪。将“http://mysite.dk/tv%C3%A6rs?test=%C3%A6”之类的网址复制粘贴到浏览器中,然后按回车键即可,它甚至会更正编码字符并将位置显示为“http: //mysite.dk/tv\xc3\xa6rs?test=\xc3\xa6"。如果然后重新加载页面(F5)它仍然有效。但是,如果我单击地址栏并再次按回车键,查询字符串将使用 latin-1 进行编码并失败。
\n\n对于任何感兴趣的人,这里有一个关于该问题的旧 Firefox 错误报告:https://bugzilla.mozilla.org/show_bug.cgi? id=284474(感谢@dtb)
\n\n所以,似乎没有什么好的解决办法。
\n\n感谢所有提供帮助的人!
\n 归档时间: |
|
查看次数: |
3446 次 |
最近记录: |