【问题标题】:Different results when using WebRequest vs WebClient使用 WebRequest 与 WebClient 时的不同结果
【发布时间】:2014-02-12 17:49:32
【问题描述】:

我们有一个文本文件,它会自动生成并放入 Web 服务器。任务是逐行读取文件并将记录插入数据库中。以下代码在 C# 中:

            WebRequest request = WebRequest.Create(url);
            WebResponse response = request.GetResponse();
            StreamReader r = new StreamReader(response.GetResponseStream());

            while (r.Peek() > -1)
            {
                string s = r.ReadLine().Trim();
                //insert string into a db.
            }

当我这样做时,我不断地得到整个文件,范围从 9000 到 10000 行。另一方面,当我使用以下内容时,有时我会得到一个截断的文件(更少的行)

            WebClient client = new WebClient();
            StreamReader r = new StreamReader(client.OpenRead(url));

            while (r.Peek() > -1)
            {
                string s = r.ReadLine().Trim();
                //insert string into a db.
            }

谁能解释其中的区别?为什么结果会不一样?我的印象是 WebClient 只是 HttpWebRequest 的包装器。

【问题讨论】:

  • WebClient OpenRead 方法是 WebRequest 的包装器。事实上,它看起来几乎与您发布的 WebRequest 代码相同。我在 ILSpy 中检查了 WebCLient 以确认。我怀疑问题出在其他地方。你能调试并确认你正在阅读的行是你所期望的吗?

标签: c# webclient webrequest


【解决方案1】:

使用Peek方法,保证你有一条完整的线准备好变红。

我敢打赌你得到了部分行(实际上是在当前流位置中断)。

实际上,我认为这与这两个类中的任何一个都无关,而与您阅读结果的方式有关。

你试过WebClient.DownloadString()方法吗?

【讨论】:

  • 这是个好主意(使用 DownloadString() 方法),然后将字符串拆分为单独的记录以插入。它有效。
  • 请注意字符串的长度...如果目标非常非常长(几 MB),您将不得不等待整个文件下载完毕,您的内存消耗将要高
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-23
  • 2018-02-09
  • 2021-06-17
相关资源
最近更新 更多