HttpWebRequest 跳转后(301,302)ResponseUri乱码问题
2014-12-24 15:13
543 查看
问题:
目标地址:http://www.baidu.com/baidu.php?url=a000000aa.7D_ifdr1XkSUzuBz3rd2ccvp2mFoJ3rOUsnx8OdxeOeOLxSeqeS-OiOvr8Pe7erQKM9ks43xuMWJuBCrsN4tEwdsRP5QfHPGmsSXOj_tTr14mx5I9qxU9vIrZ1L3xUY3IOH9tqvZu_seOgj4e_r14mI-XZ1lTrOGsS8Oj4SrZx8se59RojPakbzUJO7f.
使用HttpWebRequest请求之后,ResponseUri为:
http://chongqing.anjuke.com/sale/rd1/?kw=%EF%BF%BD%D7%B4%EF%BF%BD%CA%AE%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD&pi=baidu-cpc-cq-shantou1-jx&utm_term=%E9%87%8D%E5%BA%86%E9%A6%96%E5%88%9B%E5%8D%81%E6%96%B9%E7%95%8C
正确跳转地址(使用浏览器请求):
http://chongqing.anjuke.com/sale/rd1/?kw=%CA%D7%B4%B4%CA%AE%B7%BD%BD%E7&pi=baidu-cpc-cq-shantou1-jx&utm_term=%E9%87%8D%E5%BA%86%E9%A6%96%E5%88%9B%E5%8D%81%E6%96%B9%E7%95%8C
对比2个地址,可以发现一个奇怪的问题:地址中含有2个urlencode转换后的中文参数,奇怪的是第一个kw参数不同,而第二个utm_term参数确实相同的!这尼玛太神奇吧。。。
那么真相是什么?(找坑)
通过Fidder的Composer工具,模拟请求看看:通过上图可以看到302响应中的跳转地址,发现了异常:kw参数竟然是乱码!utm_term显示已经urlencode过了。也就有说kw未经过urlencode。被坑1
那么为什么Fidder和HttpWebRequest跳转得到的地址和为啥是
%EF...呢,答案只有一个:他们都使用了.net内部的Uri类型来初始化HttpWebRequest:
HttpWebRequest.Create(new Uri(url))
而Uri 默认对网址中的参数进行了urlencode,而且是用了错误的编码类型进行转化!!!被坑2
如何解决这个问题
计策1:设置不自动跳转,而后自己解码。。(挫计)
//有些请求的location中带有未urlencode的中文,而默认的http头是用ascii解码的,导致乱码,所以头需要重写编码下 HttpWebRequest.AllowAutoRedirect=false; var headerStr = Encoding.Default.GetString(hp.ResponseHeaders.ToByteArray()); var oHeaders = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); var sHeaderLines = headerStr.Replace("\r", "").Split('\n'); for (int i = 0; i < sHeaderLines.Length; i++) { int index = sHeaderLines[i].IndexOf(':'); if (index > 0) { oHeaders[sHeaderLines[i].Substring(0, index)] = sHeaderLines[i].Substring(index + 1).Trim(); } } var link = oHeaders["Location"];
而后在对实现一个Uri,对网址参数进行正确的编码。(感觉好难!)
未完待续...
相关文章推荐
- 关于使用HttpWebRequest和HttpWebResponse时中文乱码问题
- 解决HttpWebRequest和HtmlAgilityPack采集网页中文乱码问题
- HttpWebRequest提高效率之连接数,代理,自动跳转,gzip请求等设置问题
- Java Web(二) Servlet中response、request乱码问题解决
- JAVAWEB开发之HttpServletResponse和HttpServletRequest详解(下)(各种乱码、验证码、重定向和转发)
- [转]HttpWebRequest提高效率之连接数,代理,自动跳转,gzip请求等设置有关问题
- JAVAWEB开发之HttpServletResponse和HttpServletRequest详解(上)(各种乱码、验证码、重定向和转发)
- HttpWebResponse解决乱码问题
- Sys.webforms.PageRequestManagerParserErrorExcept(ajax刷新用response或transfer跳转遇到的问题解决办法)
- HttpServletRequest&HttpServletResponse&乱码问题
- WP开发 - HttpWebRequest的GetResponse或GetRequestStream的超时问题
- 利用HttpWebRequest/HttpWebResponse获得指定url资源的一个问题
- C#中关于搜狗地图web服务api的httpresponse中回应json中文乱码的问题 Encoding
- WinHttpRequest之get_ResponseText乱码问题
- HttpServletRequest/HttpServletResponse乱码问题解决
- JAVAWEB开发之HttpServletResponse和HttpServletRequest详解(上)(各种乱码、验证码、重定向和转发)
- HttpWebRequest下载文件,乱码问题解决方案
- javaWeb-Servlet的继承体系和HttpServletRequest中常用的方法+HttpServletResponse对中文乱码的处理
- HttpWebRequest提高效率之连接数,代理,自动跳转,gzip请求等设置问题
- 解决httpwebrequest无法通过使用代理的局域网获取response的问题