c# - 使用 Azure Function (.NET Core) 下载文件
问题描述
我已经使用 .NET Core 创建并使用 HTTP 触发 Azure 函数 (v2),希望我可以执行该函数,同时在请求正文中传递一些信息,然后让该函数在浏览器中返回/下载文件。不幸的是,我正在努力让这个工作。
下面是一段代码
public static async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequest req, ILogger log)
{
string csv;
//Do some stuff to create a csv
byte[] filebytes = Encoding.UTF8.GetBytes(csv);
req.HttpContext.Response.Headers.Add("content-disposition", "attachment;filename=Export.csv");
req.HttpContext.Response.ContentType = "application/octet-stream";
return (ActionResult)new OkObjectResult(filebytes);
}
当我使用 Postman 发帖时,请求被接受,但响应为 406“不可接受”,并且日志状态中的输出
“Microsoft.AspNetCore.Mvc.Infrastructure.DefaultOutputFormatterSelector[1] 没有为内容类型 'application/octet-stream' 找到输出格式化程序来写入响应。”
我尝试了多种内容类型,包括 text/plain 和 text/csv,都对输出格式给出了相同的响应。
如果我删除或注释掉 ContentType 请求处理并返回 200 但文件字节在响应正文中返回,而不是在浏览器中下载。
解决方案
为此,您需要一个 FileContentResult:
public static async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequest req, ILogger log)
{
string csv;
//Do some stuff to create a csv
byte[] filebytes = Encoding.UTF8.GetBytes(csv);
return new FileContentResult(filebytes, "application/octet-stream") {
FileDownloadName = "Export.csv"
};
}
虽然评论正确地指出,理想的解决方案是在 HTTP 函数中异步启动处理,返回 202 Accepted 响应,将结果保存到 blob 存储,让客户端在开始 blob 下载之前等待处理完成,然后删除下载 blob 后,当前的 Azure Functions 定价仅为 0.000016 美元/GB-s,因此除非您的流量非常高,否则您可能会发现这太复杂了。
推荐阅读
- javascript - 将状态数组中的日期转换回日期对象
- python - 如何安装依赖项的最低版本
- python - 如何解码/读取 Flask 文件系统会话文件?
- .net - 在 Powershell 中获取 .NET Framework 目录的路径
- javascript - 如何正确使用 GraphQL 订阅?
- php - 为什么 php 文件在 CLI 中有效,但在浏览器中无效?
- c++ - 有没有办法将 cpp 11 中的别名 std::make_pair 函数键入 abc::make_pair?
- upload - 有没有办法用 ABP 框架上传文件
- javascript - js 函数有时只在 Firefox 中有效,但在我的其他浏览器中一直有效
- c++ - 逆向工程 - 这是一个便宜的 3D 距离函数吗?