部署到 Azure 网站时可能导致 EvoPDF "unable to render html" 异常的原因

What could cause EvoPDF "unable to render html" exception when deployed to Azure Website

将 EvoPDF 用于 .Net Web 应用程序在本地工作,但是一旦部署到 Microsoft Azure 网站,它就会抛出一般异常:"unable to render html".

堆栈跟踪:

[Exception: Could not render the HTML string.]
   EvoPdf.HtmlToImageConverter.ᜀ(String A_0, String A_1, String A_2, ᜴& A_3, Hashtable& A_4) +2129
   EvoPdf.HtmlToPdfConverter.ᜀ(String A_0, String A_1, String A_2, String A_3, Boolean A_4) +8369
   EvoPdf.HtmlToPdfConverter.ᜀ(Stream A_0, String A_1, String A_2, String A_3, String A_4, Boolean A_5) +58
   EvoPdf.HtmlToPdfConverter.ᜁ(String A_0, String A_1, String A_2, String A_3, Boolean A_4) +126
   EvoPdf.HtmlToPdfConverter.ConvertHtml(String htmlString, String baseUrl, String internalLinksBaseUrl) +33
   EvoPdf.HtmlToPdfConverter.ConvertHtml(String htmlString, String baseUrl) +12
   td.Printing.Labels.Print.WithEvoPdf(HttpContext httpContext, Action`1 htmlPageRenderer, String outputFileName, Label labelFormat) in C:\...\Evo PDF Print Labels.vb:54
   td.OL3016WR.Render(HtmlTextWriter writer) in C:\...\OL3016WR.aspx.vb:166
   System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +80
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +8921

找到了一般原因。 EvoPDF 的一些内容与 Azure 网站不兼容。在云服务网络角色中,它工作正常。

您已达到 Azure 应用服务沙盒运行时执行限制。

来自https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox#unsupported-frameworks

Unsupported frameworks

Here is a list of frameworks and scenarios that have been found to be not be usable due to one or more of the restrictions above. It's conceivable that some will be supported in the future as the sandbox evolves.

PDF generators failing due to restriction mentioned above:

EVOPDF
Rotativa
wkhtmltopdf
Syncfusion
Siberix
NReco (uses wkhtmltopdf)
Spire.PDF

Other scenarios:
PhantomJS/Selenium: tries to connect to local address, and also uses GDI+.

正如您已经提到的,这在 Web/Worker 角色(云服务)中运行良好。 Service Fabric 或 IaaS VM 是其他选项。

EvoPdf 有针对 Azure 网站的解决方案。查看 http://www.evopdf.com/azure-html-to-pdf-converter.aspx 页面了解更多详情。

我不公正地diss Debenu。最后我在 Azure 服务器上遇到了 kernel32 LoadLibrary 问题。在我的本地机器上,它将采用相对路径并找到 dll。在 azure 上,我必须给它完整的路径,它 运行 很好。没有尝试 gdi+ 渲染器,但是 2,cairo 工作正常。

为了合规并提供答案,请确保将完整路径发送到 loadLibrary 并选择渲染器 2。一切都很好。