来自HttpWebResponse的Stream的奇怪行为

时间:2015-10-16 15:53:54

标签: c# .net stream httpwebrequest httpwebresponse

从HttpWebResponse读取流时我遇到了一些奇怪的问题。如果响应成功(200状态代码),我在访问流的Length属性时会出现异常。但是在WebException的情况下,当服务器返回一些错误(例如BadRequest)时,一切都很完美,Length工作正常。我可以直接从HttpWebResponse获取ContentLength,但想知道这种行为的原因。 Here is debug screenshot of both cases

        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);
        }

1 个答案:

答案 0 :(得分:0)

作为响应的一部分在内部创建的流(ConnectStream)不支持Length属性。不同的流根据其实现支持不同的属性。

您可以使用不同的方式从流中读取内容:

C# How do i convert System.Net.ConnectStream to a byte[] (array)