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 节省了数小时的挫败感:
我正在向第三方 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 节省了数小时的挫败感: