【发布时间】:2021-07-10 15:45:26
【问题描述】:
我在 IIS 10 上托管了 .net5.0 REST API。我想要一种通过 CSV 文件导出数据的方法。
代码示例:
[HttpGet]
[Route("download-file")]
[ProducesResponseType(typeof(FileContentResult), StatusCodes.Status200OK)]
public ActionResult DownloadFile()
{
var data = GetData();
using (var ms = new MemoryStream())
{
using (var sw = new StreamWriter(stream: ms, encoding: new UTF8Encoding(true)))
{
using (var cw = new CsvWriter(sw, CultureInfo.InvariantCulture, true))
{
cw.WriteRecords(data);
}
return File(ms.ToArray(), "application/octet-stream", "fileName.csv");
}
}
}
在数据不多的情况下有效。
当文件大小增加到 250MB 时出现问题,然后我得到 content-length: 0 没有任何错误。仅当 API 托管在 IIS 上时才会发生这种情况,当我将 API 托管在 Kestrel 中时一切正常。
我猜 IIS 有一些响应内容长度限制。 我尝试在 requestFiltering 中的 IIS 中直接设置 web.config/maxAllowedContentLength 属性,但没有结果。
有人知道如何解决这个问题吗?
【问题讨论】:
-
不要使用 MemoryStream 或
byte[]数组。现在,代码甚至在开始将数据发送到浏览器之前,都会在内存中创建 两个 数据副本。顺便说一句,CSV 文件是文本文件,而不是二进制文件。正确的内容类型是text/csv
标签: asp.net-core iis asp.net-web-api .net-5