【问题标题】:Parsing CSV from HttpResponseMessage using CSVHelper使用 CSVHelper 从 HttpResponseMessage 解析 CSV
【发布时间】:2018-08-15 13:40:54
【问题描述】:

目前我正在使用两步方法从 Web Api 获取数据并 将 CSV 记录反序列化为对象。

var response = await httpClient.GetAsync(queryString);
using (var reader = new StreamReader(await response.Content.ReadAsStreamAsync()))
{
    var csvr = new CsvReader(reader);
    var responseValue = csvr.GetRecords<TrainingDataSetData>().ToList();
    result.Readings.AddRange(responseValue);
}

如何优化这段代码?

【问题讨论】:

  • 你想在这里优化什么?时间?内存使用情况?
  • 看起来,代码正在读取响应两次。 ReadAsStreamAsync 和 GetRecords。我真正需要的是 var responseValue = csvr.GetRecords().ToList();我使用 ReadAsStreamAsync 的唯一原因是因为 CSVReader 的 StreamReader ctor arg。

标签: c# dotnet-httpclient csvhelper httpresponsemessage


【解决方案1】:

如果您试图避免创建中间MemoryStream - 您可以在HttpClient 上使用GetStreamAsync 方法,它应该返回原始NetworkStream,因为您直接传递到CsvHelper,而不是ReadAsStreamAsync ,这将默认在返回之前将完整的响应读入MemoryStream

using (var reader = new StreamReader(await httpClient.GetStreamAsync(queryString)))
{
    var csvr = new CsvReader(reader);
    var responseValue = csvr.GetRecords<TrainingDataSetData>().ToList();
    result.Readings.AddRange(responseValue);
}

如果您仍然需要访问HttpResponseMessage,您可以使用HttpCompletionOption.ResponseHeadersRead 达到相同的效果,它不会在返回之前缓冲响应。

var response = await httpClient.GetAsync(queryString, HttpCompletionOption.ResponseHeadersRead);

至于这是否实际上更有效 - 这需要在您的特定环境中进行基准测试来决定,因为它可能取决于响应的大小、网络的速度等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    相关资源
    最近更新 更多