我的代码中向一个https的地址post了一段报文数据,在本机开启Fiddler后可以看到发送和返回的结果都是正常的,程序中也能对返回结果进行正确判断处理。
问题是如果我关掉Fiddler,再通过程序发送数据,收到的结果就是乱码,如下图:
附上Fiddler中捕获到的服务器响应报文头:
HTTP/1.1 200 OK
X-Powered-By: Servlet/3.0
TicketID: 45
RspCode: 0
Content-Type: text/html;charset=UTF-8
Content-Language: zh-CN
Set-Cookie: JSESSIONID=0000Gl4QRGcbLfryUnlYimT7NF9:-1; Path=/; Secure
Date: Sat, 15 Nov 2014 15:07:47 GMT
Expires: Thu, 01 Dec 1994 16:00:00 GMT
Cache-Control: no-cache="set-cookie, set-cookie2"
Connection: Keep-alive
Keep-Alive: timeout=15, max=100
Via: 1.1 ID-0001242736524550 uproxy-2
Content-Length: 1180
<ROOT><CONF_VER>V1.0.201208211408</CONF_VER>...............//返回结果太长就不发出来了。
建议多测试几个编码。
目前测过几个编码:GBK\GB2312\UTF-8\iso-8859-1,均不能正确转换出返回结果。
@os340223: 直接用Default呢~
@幻天芒:
Default的结果也很让人伤心 。
@os340223: 是不是有什么防火墙什么的在中间干了坏事?
@os340223: 还有,先别UrlDecode看看呢~
@幻天芒:
本机环境:win7 x64,没有安装杀软,windows自带防火墙开启的。
现在我只要开启Fiddler,再通过程序去发送请求,结果就正常的。
它相当于是在我的程序和服务器之间增加了一层过滤和转换,可能这和https的证书有什么关系。我就是弄不明白这一点。
@os340223: 多贴点代码呢?
@幻天芒: 找人看过代码,搞定了。原因和证书没关系,是服务器在响应的时候用了压缩算法。我在代码中增加了解压缩后再读取流对象,就能正确获取结果了。
Stream stm = new System.IO.Compression.GZipStream(resp.GetResponseStream(), System.IO.Compression.CompressionMode.Decompress)
@os340223: 原来是服务器启用了Gzip,又学到一招,哈哈~
@os340223: 有参考的代码没有?
是不是因为fiddler自动帮你带上了证书,但是你的客户端自己没有带证书。https是要认证的吧。
https是要认证的。
我又修改了一下代码,将Fiddler生成的证书导出成pfx文件,然后在请求之前创建了一个x509Cert添加到req.ClientCertificates属性中。请求后的结果还是乱码。
谢谢关注,问题已搞定。是服务端在作怪。
@os340223: 我以前也遇到过gzip的问题。不过没和你的情况联系到一块。
楼上正解,估计是证书认证的问题,我之前写的TLS socket也是这样,如果证书不匹配或验证失败,接收到的就是乱码
如果是证书的问题,不知道有什么方法可以将该请求和证书关联起来呢?
我在浏览器的证书列表中看到了一个Fiddler创建的该网站的证书。
@os340223: 如果是本机开发的话,需要在客户端和服务器安装,在认证的时候会有两个callback函数,一个是客户端验证服务端的,另外一个相反,只要实现着两个callback就好了...
@过期明信片: 谢谢关注,问题已搞定。是服务端在作怪。 那行代码我贴在上面了。
@os340223: 如果是压缩算法的话,fiddler 应该内置了这个算法的,你应该首先排除这个...
@过期明信片: 哈哈,这不是经验不足么。今天又学到新姿势了。
多亏搜到了大哥的提问,正好解决我的问题学到了,我说明明是utf-8的编码,怎么硬是乱码呢。唉,学到了。。