Rotativa.WkhtmltopdfDriver预发布异常求助:本地正常IIS部署失败
在预发布服务器上执行Web请求时触发未处理异常,异常栈信息如下:
[Exception] Rotativa.WkhtmltopdfDriver.Convert(String wkhtmltopdfPath, String switches, String html) +975
Rotativa.WkhtmltopdfDriver.ConvertHtml(String wkhtmltopdfPath, String switches, String html) +51
Rotativa.ViewAsPdf.CallTheDriver(ControllerContext context) +1310
Rotativa.AsPdfResultBase.BuildPdf(ControllerContext context) +250
Rotativa.AsPdfResultBase.ExecuteResult(ControllerContext context) +66
System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) +13
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) +56
...(省略后续重复栈信息)
本地环境执行以下代码可正常生成PDF:
return new Rotativa.ViewAsPdf("Order", all) { FileName = "Sample.pdf" };
但在IIS部署后出现上述异常,已尝试部分解决方案但无效,请求技术帮助。
我之前在部署Rotativa到IIS时也踩过类似的坑,这类问题大多和权限、依赖组件或者文件路径有关,你可以按下面的步骤逐一排查:
检查IIS应用程序池权限
Rotativa依赖wkhtmltopdf.exe生成PDF,这个程序需要足够权限访问系统资源和临时文件。你可以先把应用程序池的标识临时改成LocalSystem测试,如果问题解决了,再换成更安全的ApplicationPoolIdentity,并给wkhtmltopdf.exe所在的文件夹(一般是项目bin目录)赋予该标识读取和执行的权限。手动指定wkhtmltopdf的完整路径
IIS部署后,Rotativa可能无法自动定位到wkhtmltopdf.exe的位置,你可以在代码里明确指定路径:var pdfResult = new ViewAsPdf("Order", all) { FileName = "Sample.pdf", WkhtmltopdfPath = Server.MapPath("~/bin/wkhtmltopdf.exe") // 根据你的实际部署路径调整 }; return pdfResult;要确认这个路径下确实存在对应版本的
wkhtmltopdf.exe,并且和服务器的系统位数(32/64位)匹配。安装wkhtmltopdf依赖的系统组件
wkhtmltopdf需要依赖Windows的Visual C++ Redistributable Packages才能运行,如果服务器没装对应的组件,就会启动失败。你可以下载和wkhtmltopdf位数一致的VC++运行库安装(比如32位程序装x86版本,64位装x64版本)。检查临时文件夹权限
Rotativa生成PDF时会用到系统临时文件夹(比如C:\Windows\Temp),确保应用程序池的标识对这个文件夹有读写权限,否则无法生成临时文件导致报错。开启Rotativa日志定位细节
你可以开启Rotativa的日志功能,获取更具体的错误信息:Rotativa.Configuration.Setup.SetupHelper.SetupLogPath(Server.MapPath("~/App_Data/RotativaLogs"));生成日志后查看里面的内容,大概率能找到具体的报错原因,比如路径不存在、权限被拒等。
如果以上方法都没解决问题,你可以直接在服务器上测试wkhtmltopdf.exe能否正常运行:打开命令行,输入wkhtmltopdf.exe的完整路径,尝试生成一个简单的PDF(比如wkhtmltopdf.exe http://www.google.com test.pdf),如果这个命令报错,那说明是wkhtmltopdf本身的问题,和Rotativa无关,针对性解决即可。
内容的提问来源于stack exchange,提问作者user1400290

