作者:重孙女俘虏 | 来源:互联网 | 2022-12-02 18:37
我已经使用.NET Core创建和HTTP触发了Azure函数(v2),希望我可以在请求正文中传递一些信息的同时执行该函数,然后让该函数在浏览器中返回/下载文件。不幸的是,我正在努力使这个工作。
以下是一段代码
public static async Task 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,但文件字节将在响应正文中返回,而不是在浏览器中下载。
1> MarkXA..:
您将需要一个FileContentResult:
public static async Task 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,因此除非流量非常大,否则您可能会发现不必要的麻烦。