Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#以CSV格式流式传输到HTTP响应_C#_Asp.net Core_Streaming_Export To Csv - Fatal编程技术网

C#以CSV格式流式传输到HTTP响应

C#以CSV格式流式传输到HTTP响应,c#,asp.net-core,streaming,export-to-csv,C#,Asp.net Core,Streaming,Export To Csv,我希望我的c#MVC控制器将结果从我的存储库流回到CSV 我见过一些使用FileResult的例子,但是这些方法似乎依赖于作为字节数组保存在内存中的文件的全部内容。我正在处理的CSV可能会很大,我希望通过直接流式传输避免将它们存储在内存中 显示了这两个示例。我从实现端点到端点的流式记录开始: [HttpGet("download")] public async IAsyncEnumerable<Foo> StreamDownload() { IAsyncE

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

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

显示了这两个示例。我从实现端点到端点的流式记录开始:

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

    await foreach(Foo foo in foos) {
        yield return convertToDto(foo);
    }
}
[HttpGet(“下载”)]
公共异步IAsyncEnumerable StreamDownload(){
IAsyncEnumerable foos=fooRepository.getAll();
等待foreach(Foo-Foo-in-foos){
收益率-收益率(foo);
}
}
然而,当尝试使用创建自定义格式化程序时,我发现HttpResponse现在使用

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

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

我能够使用这个NuGet包来处理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);
    }
}
[HttpGet(“下载”)]
[产生(“文本/csv”)]
公共异步IAsyncEnumerable StreamDownload(){
IAsyncEnumerable foos=fooRepository.getAll();
等待foreach(Foo-Foo-in-foos){
收益率-收益率(foo);
}
}