C# WebException 响应解析问题

C# WebException Response Parsing Issues

我正在向第三方 API 调用 API,代码片段用于发出请求并将响应正文从响应中提取到 .Net 3.1 中的字符串中。 我可以正常且成功地解析成功的响应。直到昨天我们都能够解析 WebException 响应,现在它们只是 return 下面的乱码字符串。

public dynamic RequestSender(HttpWebRequest request, dynamic vm)
        {
            System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
            Byte[] byteArray = encoding.GetBytes(JsonConvert.SerializeObject(vm));
            request.ContentLength = byteArray.Length;
            request.ContentType = @"application/json; ";
            try
            {
                System.IO.Stream os = request.GetRequestStream();
                os.Write(byteArray, 0, byteArray.Length); //Push it out there
                os.Close();
                System.Net.WebResponse resp = request.GetResponse();
                System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream());
                var responseString = sr.ReadToEnd().Trim();
                return responseString;
            }
            catch (WebException webErr)
            {
                return webErr;
                System.IO.StreamReader sr = new System.IO.StreamReader(webErr.Response.GetResponseStream());
                var responseString = sr.ReadToEnd().Trim();
                return responseString;
            }
            catch (Exception err)
            {
                return err;
            }
        }

预期的响应应该是:

{
    "response": {
        "errors": [
            {
                "code": "111285",
                "message": "The postal code F3FKWFIOJEF is invalid for CA United States."
            }
        ]
    }
}

但是我们得到的回应是:

"\u001f�\b[=12=][=12=][=12=][=12=][=12=][=12=]\u0003\u0014�A\n�0\u0010\u0005Ы\f�\u00161�������E�|�@L�L\u0012)�w�n\u001f��\n[r2��\u0019�Y��G�)���9w:_��o��ן�3��K��W�\"J����\"9�\u0018�䛗��\b�J���A\U00069c02@\u0006m2���s�~[=12=][=12=][=12=]��\u0003[=12=]\u0010A�(\u007f[=12=][=12=][=12=]"

我们尝试过的:

我们已经尝试更改请求,更改流阅读器用于解析响应主体的编码,同时确保响应主体具有长度,确实如此。

不确定它可能是什么,因为第三方 API 在其实现中很不寻常,因为它将响应正文附加到 400 错误请求错误中。

经过大量搜索和挖掘,我能够确定以前在后台某处创建 HttpWebRequest 时,它知道自动解压缩 Gzip 以获取响应。 然而,在某个不确定的时间点之后,该指令被遗漏,导致解析错误。 原来这不是不正确的编解码器、转换类型或响应调用的结果,而是“Deflate Gzip”之后不再是请求的一部分。

我们的修复已通过确保添加解决:

request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;

为了更好的衡量,我还把底部的代码块放到了那里。

request.KeepAlive = true;

感谢这个 post 节省了数小时的挫败感: