VB.NET调用Cisco AMP API返回200状态码但响应内容为乱码无有效数据
问题根源
你手动添加了Accept-Encoding: gzip, deflate请求头告知服务器可以返回压缩内容,但VB.NET的WebClient和HttpWebRequest默认不会自动解压gzip/deflate格式的响应,你拿到的是压缩后的二进制数据,直接用UTF8转字符串就会出现乱码。Python的requests库默认开启自动解压,所以可以直接拿到明文内容。
修正方案
通用可选优化
你同时使用了URL携带凭据、Credentials属性赋值、手动添加Authorization请求头三种认证方式,属于冗余配置,保留任意一种即可,避免部分服务器解析认证信息时出现冲突。
方案1:WebClient实现修正
两种可选处理方式:
- 最简单的方式:删除压缩请求头
直接删掉代码中request.Headers.Add("Accept-Encoding", "gzip, deflate")这一行,服务器就会返回未压缩的明文内容,原有逻辑直接可用。 - 保留压缩传输:手动处理解压
如果需要保留压缩提升传输效率,将下载到的字节先做gzip/deflate解压再转字符串:
' 下载字节后先解压 Dim rawData As Byte() = request.DownloadData(uri) Using ms As New IO.MemoryStream(rawData) Using gzip As New IO.Compression.GZipStream(ms, IO.Compression.CompressionMode.Decompress) Using reader As New IO.StreamReader(gzip, Text.Encoding.UTF8) Dim htmlResponse As String = reader.ReadToEnd() ' 后续处理逻辑 End Using End Using End Using
方案2:HttpWebRequest实现修正
直接开启框架自带的自动解压属性即可,无需手动处理解压逻辑:
' 在request初始化完成后添加这一行 request.AutomaticDecompression = Net.DecompressionMethods.GZip Or Net.DecompressionMethods.Deflate
其余逻辑不用修改,StreamReader.ReadToEnd()就能直接拿到解压后的明文内容。
内容的提问来源于stack exchange,提问作者beans1470
相关产品推荐
相关产品推荐

