Azure Function返回Blob存储PDF流时客户端接收内容异常如何解决
问题根因
你当前遇到的问题核心是Azure Function 隔离工作进程模型无法直接识别并序列化ASP.NET Core的FileStreamResult类型,运行时没有对应的处理逻辑,直接调用了对象的ToString()方法返回,因此客户端收到的是Microsoft.AspNetCore.Mvc.FileStreamResult字符串。
另外你原有服务端代码中存在拼写错误:ReadToEndAsynce()多了末尾的e,正确写法为ReadToEndAsync()。
修复方案
服务端调整(兼容所有Azure Function运行模型)
建议使用Azure Function原生的HttpResponseData构造返回流,避免跨模型兼容问题:
[Function("GetPdf")] public async Task<HttpResponseData> GetPdf( [HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestData req, FunctionContext executionContent) { // 原有请求体校验、反序列化逻辑不变 var reqBody = await new StreamReader(req.Body).ReadToEndAsync(); var theRequest = JsonConvert.DeserializeObject<TheRequest>(reqBody); var ms = await svc.GetPdfFromBlobStorage(theRequest.fileName); ms.Seek(0, SeekOrigin.Begin); // 构造PDF响应 var response = req.CreateResponse(HttpStatusCode.OK); response.Headers.Add("Content-Type", "application/pdf"); // 可选:指定下载文件名 response.Headers.Add("Content-Disposition", $"attachment; filename=\"{theRequest.fileName}\""); await response.Body.WriteAsync(ms.ToArray()); return response; }
客户端优化(可选)
新增响应状态校验逻辑,避免把错误响应内容保存为PDF文件:
static async Task Main(string[] args) { var fileInfo = new FileInfo(@"c:\temp\test.pdf"); using var client = new HttpClient(); var req = new { fileName = "the_file"}; var json = JsonConvert.SerializeObject(req); var data = new StringContent(json, Encoding.UTF8, "application/json"); var response = await client.PostAsync("http://localhost:7071/api/GetPdf", data); // 校验请求是否成功 if (!response.IsSuccessStatusCode) { Console.WriteLine($"请求失败,状态码:{response.StatusCode}"); return; } await using var ms = await response.Content.ReadAsStreamAsync(); await using var fs = File.Create(fileInfo.FullName); await ms.CopyToAsync(fs); }
如果你的Azure Function使用的是进程内运行模型,也可以直接返回File(ms, "application/pdf")替代FileStreamResult即可正常解析。
内容的提问来源于stack exchange,提问作者OneClutteredMind
相关产品推荐
相关产品推荐

