HttpWebResponse返回一个“不完整”的流

时间:2015-04-28 11:40:21

标签: c# httpwebrequest httpwebresponse text-parsing

我正在使用HttpWebRequest向Web服务器发出重复请求,但我会随机获得一个“损坏”的响应流。例如,它不包含我知道应该在那里的标签。如果我连续多次请求同一页面,则会显示“已损坏”~3 / 5。

请求总是返回200响应,所以我首先想到在响应中插入了一个空值,使StreamReader认为它已到达终点。

我试过了: 1)将所有内容读入字节数组并清理它 2)在每个请求后插入一个随机的Thread.Sleep

我的代码下面是否有任何潜在的不良做法,或者有人能告诉我为什么我会随机获得不完整的回复流吗?据我所知,我关闭了所有非托管资源,这不应该是一个问题,对吗?

public string ReturnHtmlResponse(string url)
        {
        string result;
        var request = (HttpWebRequest)WebRequest.Create(url);
            {
            using(var response = (HttpWebResponse)request.GetResponse())
                {
                  Console.WriteLine((int)response.StatusCode);
                  var encoding = Encoding.GetEncoding(response.CharacterSet);

                    using(var stream = response.GetResponseStream())
                       {
                         using(var sr = new StreamReader(stream,encoding))
                            {
                             result = sr.ReadToEnd();
                            }
                       }
                }
            }
            return result;
        }

1 个答案:

答案 0 :(得分:0)

我没有看到你的代码有任何直接缺陷。可能是其中一个'Parent'using语句是在嵌套之前完成的。 尝试将使用更改为Dispose()和Close()方法。

public string ReturnHtmlResponse(string url)
        {
        string result;
        var request = (HttpWebRequest)WebRequest.Create(url);

        var response = (HttpWebResponse)request.GetResponse();
        Console.WriteLine((int)response.StatusCode);
        var encoding = Encoding.GetEncoding(response.CharacterSet);
        var stream = response.GetResponseStream();
        var sr = new StreamReader(stream,encoding);
        result = sr.ReadToEnd();

        sr.Close();
        stream.Close();
        response.Close();

        sr.Dispose();
        stream.Dispose();
        response.Dispose();

        return result;
        }