我在从HttpWebResponse读取流时遇到了一些奇怪的问题。在成功响应(200状态码)的情况下,当访问流的长度属性时,我得到异常。但在webeexception的情况下,当服务器返回一些错误(例如BadRequest),一切都是完美的,长度工作正常。我可以直接从HttpWebResponse获得ContentLength,但想知道这种行为的原因。下面是两种情况的调试截图
try
{
var request = (HttpWebRequest) WebRequest.Create(uriString);
request.Method = HttpMethod.Get.Method;
request.ContentType = "application/json";
response = (HttpWebResponse) request.GetResponse();
statusCode = response.StatusCode;
responseString = DecodeResponse(response);
}
catch (WebException ex)
{
response = (HttpWebResponse) ex.Response;
responseString = DecodeResponse(response);
statusCode = response.StatusCode;
}
private static string DecodeResponse(HttpWebResponse response)
{
byte[] data;
using (Stream stream = response.GetResponseStream())
{
data = new byte[stream.Length];
stream.Read(data, 0, data.Length);
}
return Encoding.UTF8.GetString(data);
}
作为响应的一部分在内部创建的流(ConnectStream)不支持Length属性。不同的流支持不同的属性,这取决于它们的实现。
你可以用一种不同的方式从流中读取,就像这篇文章:
c#如何将System.Net.ConnectStream转换为byte[] (array)