Business Central SaaS环境下TempBlob生成SHA256哈希不符的解决方案问询
解决Dynamics 365 Business Central SaaS环境下PDF流SHA256哈希校验失败问题
问题场景
在Dynamics 365 Business Central SaaS环境中,通过TempBlob生成PDF文件流并计算SHA256哈希值时,结果始终无法通过接收方的校验。但将该流下载为本地文件后计算的哈希值是符合要求的;本地环境使用File类型变量生成的哈希值则完全正常。
核心原因
调用REPORT.SaveAs将PDF内容写入TempBlob的OutStream后,流的指针停留在了内容末尾。此时直接调用TempBlob.CreateInStream读取,实际读取的是空内容,导致计算出的哈希值错误。而本地File方式是重新打开文件,流指针默认重置到起始位置,因此能正确读取全部PDF内容。
解决方案
在写入OutStream后,必须手动将流指针重置到起始位置,再创建InStream读取内容;或者通过TempBlob.LoadFromStream方法确保内容被正确加载后再读取。
修正后的SaaS环境代码
TempBlob.CreateOutStream(OutStream); SalesInvoiceHeader2.get('22-XXXXX'); // 示例编号 RecRef.GetTable(SalesInvoiceHeader2); RecRef.SetRecFilter(); if REPORT.SaveAs(gRecSelection."Report ID", '', ReportFormat::Pdf, OutStream, RecRef) then begin // 重置OutStream指针到起始位置 OutStream.Position(0); // 将流内容重新加载到TempBlob(可选,确保内容完整) TempBlob.LoadFromStream(OutStream); // 创建InStream读取内容 TempBlob.CreateInStream(InStream); end; HashValue := CU_CryptographyMgmt.GenerateHash(Instream, Algorithm::SHA256);
关键修改点
- 添加
OutStream.Position(0):将写入后的流指针重置到开头,确保后续读取能获取全部内容 - 可选添加
TempBlob.LoadFromStream(OutStream):重新加载流内容到TempBlob,进一步避免流状态异常导致的读取问题
验证方式
生成哈希后,可将TempBlob的内容导出为本地文件,对比文件哈希值是否与生成的HashValue一致,确认修复有效。
内容的提问来源于stack exchange,提问作者Francesco Lanza
相关产品推荐
相关产品推荐

