首页 > 解决方案 > 使用 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 但文件字节在响应正文中返回,而不是在浏览器中下载。

标签: c#asp.net-core.net-coreazure-functionsazure-functions-runtime

解决方案


为此,您需要一个 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,因此除非您的流量非常高,否则您可能会发现这太复杂了。


推荐阅读