【发布时间】:2018-04-09 03:55:08
【问题描述】:
我无法将 .NET Core API 控制器端点解析为 CSV 下载。我正在使用从 .NET 4.5 控制器中提取的以下代码:
[HttpGet]
[Route("{id:int}")]
public async Task<HttpResponseMessage> Get(int id)
{
string csv = await reportManager.GetReport(CustomerId, id);
var response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content = new StringContent(csv);
response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/csv");
response.Content.Headers.ContentDisposition =
new ContentDispositionHeaderValue("attachment") { FileName = "report.csv" };
return response;
}
当我从我的 Angular 4 应用程序中访问此端点时,我收到以下响应写入浏览器:
{
"version": {
"major": 1,
"minor": 1,
"build": -1,
"revision": -1,
"majorRevision": -1,
"minorRevision": -1
},
"content": {
"headers": [
{
"key": "Content-Type",
"value": [
"text/csv"
]
},
{
"key": "Content-Disposition",
"value": [
"attachment; filename=11.csv"
]
}
]
},
"statusCode": 200,
"reasonPhrase": "OK",
"headers": [ ],
"requestMessage": null,
"isSuccessStatusCode": true
}
我的期望是,当我点击端点时,会提示用户下载 CSV。
我发现this 发布了有关如何在 .NET Core 中“导出”CSV 的帖子。问题是我正在从其源(AWS S3 存储桶)检索内存中的 CSV,而此代码似乎仅在您拥有 IEnumerable<object> 时才有效。
我想知道我的问题是出在请求标头还是响应标头中,其中存在阻止浏览器从我的 API 检索 CSV 的东西。这是我在浏览器控制台中看到的:
【问题讨论】:
-
另一个注意事项,在这种情况下,通常最好使用输出格式器,例如读取acceptencoding或其他规则。如果您正在处理一个大型项目,您可能需要使用 csv 导出来获取多种方法,并且如果您将创建通用格式,则可以避免将来不必要的工作。可以是中间件中的一层
-
@zxxc 你有什么要补充的吗?您链接到我帖子的链接中引用的文章不是很有帮助。
-
看起来好像您正在通过 AJAX 获取下载。当您这样做时,您需要将
responseType设置为arraybuffer并在您的成功方法中从响应数据中创建一个blob。您还需要手动处理实际下载,方法是创建包含该数据的链接并“单击”它。这一切都不会自动为您发生。 -
@ChrisPratt 在网络流量截图中,我直接在浏览器中点击了 URL。
标签: c# asp.net csv asp.net-core