【问题标题】:HttpWebResponse returns an 'incomplete' streamHttpWebResponse 返回一个“不完整”的流
【发布时间】:2015-07-07 05:55:28
【问题描述】:

我正在使用 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;
        }

【问题讨论】:

  • 你试过WebClient的“DownloadString”方法吗?
  • 尝试使用硬编码进行测试。例如,Encoding.GetEncoding("ISO-8859-1")。我在这里看不到任何缺陷,应该可以工作。请记住,错误可能是服务器端的
  • @Pak 是的,尝试了 WebClient DownloadString 和 HtmlAgilityPack HtmlWeb.Load。结果相同:/
  • @NickProzee 感谢您的意见。我尝试对其进行硬编码,但结果相同。就像你说的,也许是在服务器端。那样的话我就完蛋了。

标签: c# httpwebrequest httpwebresponse text-parsing


【解决方案1】:

我看不出你的代码有任何直接的缺陷。可能是“父”使用语句之一在嵌套语句之前完成。 尝试将 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;
        }

【讨论】:

  • 谢谢,我试过了,但不幸的是问题仍然存在。我现在假设这是一个服务器端错误,并强制它直到流满足我的条件。海拉丑陋,但该怎么办:/
  • 面临类似问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-23
  • 1970-01-01
  • 2014-10-05
  • 2019-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多