Rotativa PDF 生成在本地工作但不在 IIS 7 上工作

Rotativa PDF generation working locally but not on IIS 7

我有一个 ASP.NET MVC 5 应用程序。它有一个简单的表单,当用户提交它时,表单存储在缓存中,然后调用另一个控制器操作,该操作将 return 模型作为 PDF 的视图。

我没有必要保存到本地,只是为了在浏览器中显示,以便用户下载。

也不需要数据库,这就是我将模型存储在缓存中的原因。

本地,在 Visual studio 2013 年,它工作正常。但是当我将它发布到 IIS 7 时,我得到一个 Unhandled Execution Error。这是我返回的堆栈跟踪:

 Unhandled Execution Error
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Exception:

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:


[Exception]
   Rotativa.WkhtmltopdfDriver.Convert(String wkhtmltopdfPath, String switches, String html) +1364
   Rotativa.WkhtmltopdfDriver.ConvertHtml(String wkhtmltopdfPath, String switches, String html) +70
   Rotativa.ViewAsPdf.CallTheDriver(ControllerContext context) +1986
   Rotativa.AsPdfResultBase.BuildPdf(ControllerContext context) +380
   Rotativa.AsPdfResultBase.ExecuteResult(ControllerContext context) +69
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) +109
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) +890
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) +97
   System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +241
   System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +29
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +111
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +53
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +19
   System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +51
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +111
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +606
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +288


Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.34248 

我最初使用ActionAsPDF(),但现在我也尝试使用return new ViewAsPDF()。两者都给出相同的错误和堆栈跟踪。这是否与权限有关?

此错误是缺少 Visual Studio 2013 文件的 C++ 可再发行包,名为 (MSVCP120.dll)。

解决问题:

  1. 打开下面的 Visual Studio 2013 可下载 link 的 C++ 可再发行组件包: download Visual C++ Redistributable Packages for Visual Studio 2013

  2. 单击下载并选择文件 (vcredist_x86.exe),即使您是 运行 X64 位服务器版本。

  3. 安装文件。

查看 Jalal W Hijazi 博客 http://jwhijazi.blogspot.com/2015/05/solving-rotativa-unhandled-exception.html 了解更多详情。

我通过更新找到的安装程序中的 wkhtmltopdf 文件解决了我的问题 here

现在工作完美!

如答案中链接的博客的评论中所述,如果您不想/不能轻易将以下 2 个 dll 文件复制到服务器上的 rotativa 文件夹中在服务器上安装东西。

msvcr120.dll
msvcp120.dll

如果它在本地工作,您应该已经有两个可用的 dll 文件。 您需要 x86 版本,如果您发现与 vs 2015 一起打包的 x64 版本它们不起作用。我在这里找到了正确的版本:

C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\redist\x86\Microsoft.VC120.CRT

升级到 Rotativa 1.7.3 后,这不再有效。我不得不从 visual studio 2017 复制一些新的 dll,这次我在这里找到了它们:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\redist\x86\Microsoft.VC140.CRT

我不得不复制过来

msvcp140.dll
vcruntime140.dll

我遇到了同样的问题。甚至错误记录器也没有记录任何内容。

经过一些研究,我尝试用 wkhtmltopdf.org 网站上可用的最新版本替换 wkhtmltopdf.exe,仍然没有成功。

最终将 msvcp120.dllmsvcr120.dll 复制到我有可执行文件的文件夹中并且它起作用了。 (不需要 wkhtmltopdf.exe 的最新版本,而是使用我从 Nuget 获得的版本。)

msvcp120.dll 和 msvcr120.dll 在 Windows 7.

的以下目录中可用

C:\Windows\SysWOW64\

接受的答案几乎对我有用。我缺少 C++ 可再发行组件的较新版本,因此安装旧版本没有帮助。

找出遗漏内容的最简单方法是手动 运行 wkhtmltopdf.exe。它会为您提供控制台输出(如果工作的话)或有关缺少内容的消息框。

我遗漏了 MSVCP140.dll,它来自 VS 2015 redist,可在此处获取:https://www.microsoft.com/en-gb/download/details.aspx?id=48145

当我从 Rotativa 1.6.4 升级到 1.7.3 时,我的网站应用程序上的 PDF 转换停止工作,在 运行 我的生产服务器上的 wkhtmltopdf.exe 之后,我注意到它有问题msvcp140.dll

解决方案是为 Visual Studio 2015 安装 Visual C++ Redistributable https://www.microsoft.com/en-us/download/details.aspx?id=48145

我为 Visual Studio 2015

安装了 Visual C++ Redistributable Packages

https://www.microsoft.com/pt-br/download/details.aspx?id=48145

这为我解决了。