35

我有一个 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(). 两者都给出相同的错误和堆栈跟踪。这是否与权限有关?

4

7 回答 7

53

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

要解决问题:

  1. 打开下面的 Visual Studio 2013 的 C++ 可再发行包可下载链接: 下载 Visual Studio 2013 的 Visual C++ 可再发行包

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

  3. 安装文件。

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

于 2015-07-08T14:00:12.570 回答
18

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

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

于 2016-04-26T23:33:01.230 回答
10

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

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

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

于 2017-07-12T12:35:42.107 回答
8

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

在此处输入图像描述

现在工作完美!

于 2015-07-19T05:38:45.593 回答
6

当我从 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

于 2017-10-12T23:28:32.240 回答
1

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

经过一番研究,我尝试用wkhtmltopdf.orgwkhtmltopdf.exe网站上提供的最新版本替换它,但仍然没有运气。

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

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

C:\Windows\SysWOW64\

于 2016-10-04T07:54:39.997 回答
1

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

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

这为我解决了。

于 2018-09-24T19:12:17.563 回答