使用 Azure Function (.NET Core) 下载文件

Using Azure Function (.NET Core) to Download a file

我已经使用 .NET Core 创建了 HTTP 触发的 Azure 函数 (v2),希望我可以在请求正文中传递一些信息的同时执行该函数,然后让函数 return/download 成为一个文件在浏览器中。不幸的是,我正在努力让它工作。

下面是一段代码

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 执行 post 时,请求被接受但响应为 406 "unacceptable" 并且日志中的输出状态为

"Microsoft.AspNetCore.Mvc.Infrastructure.DefaultOutputFormatterSelector[1] 找不到用于写入响应的内容类型 'application/octet-stream' 的输出格式化程序。"

我已经尝试了多种内容类型,包括 text/plain 和 text/csv,所有内容类型都对输出格式给出了相同的响应。

如果我删除或注释掉请求处理的 ContentType 和 returns 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 函数中异步启动处理,return 202 已接受响应,将结果保存到 blob 存储,让客户端等待处理以在开始下载 blob 之前完成,然后在下载 blob 后将其删除,当前的 Azure Functions 定价仅为 0.000016 美元/GB-s,因此您可能会发现这太复杂了,除非您的流量非常高。