我有一个简单的 Web API
using DocumentFormat.OpenXml.Packaging;
[HttpPost("clone")]
public IActionResult CloneBillFromTemplate()
{
var templateFilePath = System.IO.Path.Combine(Directory.GetCurrentDirectory(), "Bill", "PaymentTempl.docx");
var clonedFilePath = System.IO.Path.Combine(Directory.GetCurrentDirectory(), "Bill", "ClonedBill.docx");
var pdfFilePath = System.IO.Path.Combine(Directory.GetCurrentDirectory(), "Bill", "FinalBill.pdf");
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(templateFilePath, true))
{
var clonedDoc = wordDoc.Clone(clonedFilePath);
System.Threading.Thread.Sleep(500);
clonedDoc.Save();
clonedDoc.Close();
}
using (var converter = new OfficeConverter.Converter())
{
converter.Convert(clonedFilePath, pdfFilePath);
}
return Ok();
}
在调试(当然:3)和 IIS 时一切正常
但是当我部署到 Azure App 服务时,我收到了这种类型的错误(堆栈跟踪 + 异常消息)。
<块引用>无法读取注册表以检查 Word 版本
<块引用>找不到注册表项 Word.Application\CurVer 在 OfficeConverter.Word...ctor() 在 OfficeConverter.Converter.get_Word() 在 OfficeConverter.Converter.Convert(String inputFile, String outputFile, Stream logStream) at ....
你们能帮我解决这个问题吗?谢谢大家!!!
**请随时询问检测此问题所需的更多信息
更新 看起来这是我使用的 pdf 转换器 pacakge 的问题,而不是 OpenXML
答案 0 :(得分:1)
您的应用程序似乎以不受支持的方式依赖 Windows 注册表。如果您在 Linux 应用服务上运行,那将是第一个要换出的东西,尽管我猜您已经在 Windows 上运行了。
<块引用>应用程序对其运行的虚拟机的大部分(尽管不是全部)注册表具有只读访问权限。实际上,这意味着应用程序可以访问允许对本地用户组进行只读访问的注册表项。当前不支持读取或写入访问的注册表区域之一是 HKEY_CURRENT_USER 配置单元。
对注册表的写访问被阻止,包括对任何每用户注册表项的访问。
https://docs.microsoft.com/en-us/azure/app-service/operating-system-functionality#registry-access
如果您无法重构代码以不依赖此类依赖项,我建议您将应用程序放在 Windows docker container 中。如果您可以在本地运行它,它也应该在应用服务上运行。