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)。
解决问题:
打开下面的 Visual Studio 2013 可下载 link 的 C++ 可再发行组件包:
download Visual C++ Redistributable Packages for Visual Studio 2013
单击下载并选择文件 (vcredist_x86.exe),即使您是 运行 X64 位服务器版本。
安装文件。
查看 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.dll
和 msvcr120.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
这为我解决了。
我有一个 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)。
解决问题:
打开下面的 Visual Studio 2013 可下载 link 的 C++ 可再发行组件包: download Visual C++ Redistributable Packages for Visual Studio 2013
单击下载并选择文件 (vcredist_x86.exe),即使您是 运行 X64 位服务器版本。
安装文件。
查看 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.dll
和 msvcr120.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 Packageshttps://www.microsoft.com/pt-br/download/details.aspx?id=48145
这为我解决了。