Azure Function读取HTTP请求体截断致SHA256校验失败问题求助
问题解决:Azure Function计算PDF文件SHA256值不一致的问题
问题根源
核心错误在于用文本流读取器(StreamReader)处理二进制PDF文件,并通过Encoding.UTF8.GetBytes()将字符串转回字节数组——这个过程会直接破坏二进制数据:
- StreamReader是为文本设计的,会尝试将二进制字节解码为UTF-8文本,遇到无法解码的字节时会替换为默认占位符,导致原始字节丢失或篡改
- 即使PDF能正常打开,二进制转字符串再转回字节的操作必然改变原始字节序列,最终导致SHA256计算结果错误
- 另外,
req.Body.Length在分块传输等场景下并不准确,不能作为原始文件大小的可靠参考
修正后的代码
直接读取原始二进制字节流计算哈希,完全避免文本转换操作:
using System; using System.IO; using System.Security.Cryptography; using Microsoft.AspNetCore.Mvc; public static async Task<IActionResult> Run(HttpRequest req, ILogger log) { log.LogInformation("C# HTTP trigger function processed a request."); // 读取请求体的原始二进制字节 byte[] fileBytes; using (var memoryStream = new MemoryStream()) { await req.Body.CopyToAsync(memoryStream); fileBytes = memoryStream.ToArray(); } log.LogInformation("实际读取的文件字节数: " + fileBytes.Length); // 计算SHA256哈希 using var sha256 = SHA256.Create(); var hashBytes = sha256.ComputeHash(fileBytes); string hexHash = Convert.ToHexString(hashBytes); return new OkObjectResult(hexHash); }
额外注意事项
- 确保Logic Apps在调用Azure Function时,直接传递PDF文件的原始二进制内容作为请求体,不要经过Base64编码或其他文本转换步骤
- 若Logic Apps流程中存在"Parse JSON"等文本处理环节,会破坏二进制数据,需移除这类步骤后再传递文件内容
内容的提问来源于stack exchange,提问作者Gilloufcr
相关产品推荐
相关产品推荐

