【背景描述】
交付反馈一个客户请求我们的一个业务查询接口,在我们的后台日志观察客户的数据请求都是正常返回的,但是用户反馈,约有50%请求无法正常接收到结果。且对方提供了数据请求时候返回的报文header,如下:
结果返回正常时候的header头信息:
结果返回异常时候的header头信息:
【解决过程】
从两张图片来看,数据返回正常时候并没有“Content-Encoding: gzip“,即当传输的数据采用gzip时候,会造成请求结果异常。
我们前端采用的nginx作为代理转发服务器,检查gzip相关配置参数如下:
可以看到,对于大于1k且满足压缩类型(默认就已经包含text/html,所以上面没写)的数据,服务器在传出数据的时候会进行压缩。
但是我们给客户的客户端是针对所有企业用户的,目前只有这个客户反馈有异常,其他客户均没有。经过和客户沟通,对方在我们提供的客户端代码中自己添加了一条代码headers.put(“Accept-Encoding”, “gzip,deflate”);,如下图:
这条代码就是造成异常的主要原因:
【解决总结】
想要获得正确网页内容,而非乱码的话,就有两种方式了:
1.不要设置Accept-Encoding的Header
//req.Headers.Add(“Accept-Encoding”, “gzip,deflate”);
2.设置Accept-Encoding的Header,同时设置对应的自动解压缩的模式
req.Headers[“Accept-Encoding”] = “gzip,deflate”;
req.AutomaticDecompression = DecompressionMethods.GZip;
结果证明,这样也是可以获得对应的格式正确的数据,而不是乱码的。
这就意味着,如果你获取网页内容太大的话,那么还是可以用这个办法的,这样就可以让HttpWebRequest自动帮你实现对应的解压缩了,可以减少数据数据传输量,节省时间,提高效率。需要注意的是,如果是请求的网页返回的内容不多的话,比如只有几K,那么用了此自动解压缩的设置,也没啥效率的提高,因为毕竟自动解压,也是要花时间的。所以,就是个权衡问题了,以实测结果为准,觉得是否采用自动解压。
参考:https://blog.csdn.net/mycar001/article/details/78391028