简体   繁体   English

HttpWebResponse返回“不完整”流

[英]HttpWebResponse returns an 'incomplete' stream

I´m making repeated requests to a web server using HttpWebRequest, but I randomly get a 'broken' response stream in return. 我正在使用HttpWebRequest向Web服务器重复请求,但作为回报,我随机获得了“中断”响应流。 eg it doesn´t contain the tags that I KNOW is supposed to be there. 例如,它不包含“我知道”应该在那里的标签。 If I request the same page multiple times in a row it turns up 'broken' ~3/5. 如果我连续多次请求同一页面,它会“破损”〜3/5。

The request always returns a 200 response so I first thought there was a null value inserted in the response that made the StreamReader think it reached the end. 该请求始终返回200响应,因此我首先认为响应中插入了一个空值,使StreamReader认为它已到达末尾。

I´ve tried: 1) reading everything into a byte array and cleaning it 2) inserting a random Thread.Sleep after each request 我尝试过:1)将所有内容读取到字节数组中并进行清理2)在每个请求之后插入随机Thread.Sleep

Is there any potentially bad practice with my code below or can anyone tell me why I´m randomly getting an incomplete response stream? 下面的代码是否存在任何潜在的不良做法,或者谁能告诉我为什么我随机获得不完整的响应流? As far as I can see I´m closing all unmanaged resources so that shouldn´t be a problem, right? 据我所见,我正在关闭所有非托管资源,所以应该不会有问题吧?

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

I do not see any direct flaws in you're code. 我看不到您的代码有任何直接缺陷。 What could be is that one of the 'Parent' using statements is done before the nested one. 可能是“父项”使用语句之一在嵌套语句之前完成。 Try changing the using to a Dispose() and Close() method. 尝试将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;
        }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM