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

问题描述 投票:0回答:7

我有一个 ASP.NET MVC 5 应用程序。它有一个简单的表单,当用户提交它时,该表单将存储在缓存中,然后调用另一个控制器操作,该操作将模型作为 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()
。两者都给出相同的错误和堆栈跟踪。这是否与权限有关?

iis-7 asp.net-mvc-5 rotativa
7个回答
58
投票

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

解决问题:

  1. 打开下面的 Visual Studio 2013 C++ 可再发行包下载链接: 下载适用于 Visual Studio 2013 的 Visual C++ 可再发行组件包 最新版本:https://aka.ms/vs/17/release/vc_redist.x86.exe

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

  3. 安装文件。

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


18
投票

正如答案中链接的博客评论中提到的,如果您不想/无法轻松在服务器上安装东西,您可以将以下 2 个 dll 文件复制到服务器上的

rotativa
文件夹中。

msvcr120.dll

msvcp120.dll

如果它在本地工作,您应该已经有两个可用的 dll 文件。 您需要 x86 版本,如果您发现与 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


10
投票

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

找出缺失内容的最简单方法是手动运行

wkhtmltopdf.exe
。它要么给你控制台输出(如果工作),要么给你一个关于缺少什么的消息框。

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


8
投票

我通过更新安装程序中的 wkhtmltopdf 文件解决了我的问题这里

enter image description here

现在工作完美!


7
投票

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

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


2
投票

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

经过一番研究,我尝试将

wkhtmltopdf.exe
替换为 wkhtmltopdf.org 网站上提供的最新版本,但仍然没有成功。

最后将

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

msvcp120.dll 和 msvcr120.dll 在 Windows 7 的以下目录中可用。

C:\Windows\SysWOW64\


1
投票

我安装了 Visual Studio 2015 的 Visual C ++ Redistributable Packages

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

这为我解决了。

© www.soinside.com 2019 - 2024. All rights reserved.