【问题标题】:C# Streaming to HTTP Response as CSVC# 以 CSV 格式流式传输到 HTTP 响应
【发布时间】:2020-10-12 12:11:30
【问题描述】:

我希望我的 c# MVC 控制器将结果从我的存储库流式传输回 CSV。

我已经看到了一些使用FileResult 的示例,但是这些方法似乎依赖于作为字节数组保存在内存中的文件的全部内容。我正在处理的 CSV 可能会很大,我想通过直接流式传输来避免将它们存储在内存中。

This answer 显示了这两个示例。我首先实现了我的端点以将记录流式传输到端点:

[HttpGet("download")]
public async IAsyncEnumerable<Foo> StreamDownload() {
    IAsyncEnumerable<Foo> foos = fooRepository.getAll();

    await foreach(Foo foo in foos) {
        yield return convertToDto(foo);
    }
}

但是,当尝试使用 this guide 创建自定义格式化程序时,我发现 HttpResponses 现在使用 a PipeWriter to handle their I/O connections

我正在尝试创建一个自定义格式化程序,该格式化程序将从 IAsyncEnumerable 读取并写入 PipeWriter。但是,由于这是一个很常见的问题,我认为值得检查:

  • 这是正确的方法吗?
  • 是否已经存在类似的转换器? (我找不到)
  • 在创建此转换器时是否还有其他值得查看的指南/示例?

【问题讨论】:

    标签: c# asp.net-core streaming export-to-csv


    【解决方案1】:

    我能够使用这个 NuGet 包来处理 CSV 序列化: https://www.nuget.org/packages/WebApiContrib.Core.Formatter.Csv/

    只需将序列化程序添加到服务中:

    var csvOptions = new CsvFormatterOptions {
      UseSingleLineHeaderInCsv = true,
      CsvDelimiter = ",",
      IncludeExcelDelimiterHeader = true
    };
    
    services.AddMvc().AddCsvSerializerFormatters(csvOptions);
    

    ..并将方法标记为返回 CSV:

    [HttpGet("download")]
    [Produces("text/csv")]
    public async IAsyncEnumerable<Foo> StreamDownload() {
        IAsyncEnumerable<Foo> foos = fooRepository.getAll();
    
        await foreach(Foo foo in foos) {
            yield return convertToDto(foo);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-02-19
      • 2020-11-28
      • 2022-01-06
      • 1970-01-01
      • 2019-12-29
      • 2012-04-02
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      相关资源
      最近更新 更多