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

时间:2015-06-29 09:36:42

标签: iis-7 asp.net-mvc-5 rotativa

我有一个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()。两者都给出相同的错误和堆栈跟踪。这是否必须使用权限执行某些操作?

8 个答案:

答案 0 :(得分:45)

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

解决问题:

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

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

  3. 安装文件。

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

答案 1 :(得分:14)

正如答案中链接的博客评论中所述,如果您不想/可以&#39;那么您可以将以下两个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后,这已不再适用。我不得不从2017年的视觉工作室复制一些新的dll,我这次在这里找到了它们:

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

我不得不复制

msvcp140.dll
vcruntime140.dll

答案 2 :(得分:7)

我通过更新找到的here

安装程序中的wkhtmltopdf文件修复了我的问题

enter image description here

现在正在完美地工作!

答案 3 :(得分:6)

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

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

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

答案 4 :(得分:5)

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

答案 5 :(得分:1)

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

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

最后将msvcp120.dllmsvcr120.dll复制到我拥有excutable的文件夹中,并且工作正常。 (不需要最新版本的wkhtmltopdf.exe,而是使用了我从Nuget获得的版本。)

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

  

C:\的Windows \ Syswow64资料\

答案 6 :(得分:1)

我为Visual Studio 2015安装了Visual C ++可再发行组件包

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

这为我解决了。

答案 7 :(得分:-1)

我两次遇到这个问题,原因很多: 1-也许您缺少C ++可再发行组件(MSVCP120.dll)..

2-如果您在特定域中托管,请单击应用程序池 - >单击您的域(example.net) - &gt;提前设置 - &gt;检查您在身份中的身份模型:您应该以身份登录管理员用户 ..

如果您的网站位于默认应用程序池中,则应单击默认网站 - &gt;基本设置 - &gt;连接为:管理员用户