首页新闻找找看学习计划

C#代码提交https请求后,返回结果为乱码。

0
悬赏园豆:100 [已解决问题] 解决于 2014-11-17 18:46

我的代码中向一个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>...............//返回结果太长就不发出来了。

os340223的主页 os340223 | 初学一级 | 园豆:5
提问于:2014-11-15 23:10
< >
分享
最佳答案
0

建议多测试几个编码。

收获园豆:40
幻天芒 | 高人七级 |园豆:36522 | 2014-11-15 23:55

目前测过几个编码:GBK\GB2312\UTF-8\iso-8859-1,均不能正确转换出返回结果。

os340223 | 园豆:5 (初学一级) | 2014-11-15 23:57

@os340223: 直接用Default呢~

幻天芒 | 园豆:36522 (高人七级) | 2014-11-15 23:58

@幻天芒: 

Default的结果也很让人伤心 。

os340223 | 园豆:5 (初学一级) | 2014-11-16 00:01

@os340223: 是不是有什么防火墙什么的在中间干了坏事?

幻天芒 | 园豆:36522 (高人七级) | 2014-11-16 00:04

@os340223: 还有,先别UrlDecode看看呢~

幻天芒 | 园豆:36522 (高人七级) | 2014-11-16 00:05

@幻天芒: 

本机环境:win7 x64,没有安装杀软,windows自带防火墙开启的。

现在我只要开启Fiddler,再通过程序去发送请求,结果就正常的。

它相当于是在我的程序和服务器之间增加了一层过滤和转换,可能这和https的证书有什么关系。我就是弄不明白这一点。

os340223 | 园豆:5 (初学一级) | 2014-11-16 00:08

@os340223: 多贴点代码呢?

幻天芒 | 园豆:36522 (高人七级) | 2014-11-16 00:11

@幻天芒:  找人看过代码,搞定了。原因和证书没关系,是服务器在响应的时候用了压缩算法。我在代码中增加了解压缩后再读取流对象,就能正确获取结果了。

Stream stm = new System.IO.Compression.GZipStream(resp.GetResponseStream(), System.IO.Compression.CompressionMode.Decompress)

os340223 | 园豆:5 (初学一级) | 2014-11-17 18:51

@os340223: 原来是服务器启用了Gzip,又学到一招,哈哈~

幻天芒 | 园豆:36522 (高人七级) | 2014-11-17 19:03

@os340223: 有参考的代码没有?

crystal sun | 园豆:200 (初学一级) | 2018-04-08 16:24
其他回答(3)
0

是不是因为fiddler自动帮你带上了证书,但是你的客户端自己没有带证书。https是要认证的吧。

收获园豆:30
angelshelter | 园豆:9676 (大侠五级) | 2014-11-16 21:16

https是要认证的。
我又修改了一下代码,将Fiddler生成的证书导出成pfx文件,然后在请求之前创建了一个x509Cert添加到req.ClientCertificates属性中。请求后的结果还是乱码。

支持(0) 反对(0) os340223 | 园豆:5 (初学一级) | 2014-11-17 16:36

谢谢关注,问题已搞定。是服务端在作怪。 

支持(0) 反对(0) os340223 | 园豆:5 (初学一级) | 2014-11-17 18:51

@os340223: 我以前也遇到过gzip的问题。不过没和你的情况联系到一块。

支持(0) 反对(0) angelshelter | 园豆:9676 (大侠五级) | 2014-11-18 09:16
0

楼上正解,估计是证书认证的问题,我之前写的TLS socket也是这样,如果证书不匹配或验证失败,接收到的就是乱码

收获园豆:30
我不是杰克船长 | 园豆:238 (菜鸟二级) | 2014-11-17 15:29

如果是证书的问题,不知道有什么方法可以将该请求和证书关联起来呢?
我在浏览器的证书列表中看到了一个Fiddler创建的该网站的证书。

支持(0) 反对(0) os340223 | 园豆:5 (初学一级) | 2014-11-17 15:36

@os340223: 如果是本机开发的话,需要在客户端和服务器安装,在认证的时候会有两个callback函数,一个是客户端验证服务端的,另外一个相反,只要实现着两个callback就好了...

支持(0) 反对(0) 我不是杰克船长 | 园豆:238 (菜鸟二级) | 2014-11-17 18:51

@过期明信片: 谢谢关注,问题已搞定。是服务端在作怪。 那行代码我贴在上面了。

支持(0) 反对(0) os340223 | 园豆:5 (初学一级) | 2014-11-17 18:51

@os340223: 如果是压缩算法的话,fiddler 应该内置了这个算法的,你应该首先排除这个...

支持(0) 反对(0) 我不是杰克船长 | 园豆:238 (菜鸟二级) | 2014-11-17 18:57

@过期明信片: 哈哈,这不是经验不足么。今天又学到新姿势了。

支持(0) 反对(0) os340223 | 园豆:5 (初学一级) | 2014-11-17 19:00
0

多亏搜到了大哥的提问,正好解决我的问题学到了,我说明明是utf-8的编码,怎么硬是乱码呢。唉,学到了。。

 

小小高 | 园豆:172 (初学一级) | 2016-11-23 17:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册