使用Rotativa的MVC5应用程序在IIS上发布时不起作用

时间:2016-08-17 17:09:09

标签: asp.net asp.net-mvc asp.net-mvc-5 redistributable rotativa

我正在使用Rotativa将视图转换为PDF。它适用于我的本地但在IIS服务器上发布时会出现如下错误:

来源错误:

  

执行期间生成了未处理的异常   当前的网络请求。有关的来源和位置的信息   可以使用下面的异常堆栈跟踪来识别异常。

堆栈追踪:

.appref-ms

不确定服务器为何显示控制器上下文的本地路径。我正在使用默认路由。有什么特别需要修改的吗?

以下是我用来传递控制器的代码段:

[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
   projectName.Models.ViewAsPdf2.GetByte(ControllerContext context) in C:\Users\username\Documents\Visual Studio 2015\Projects\projectName\Models\ModelClass.cs:91
   projectName.Controllers.<ModelClass>d__1.MoveNext() in C:\Users\username\Documents\Visual Studio 2015\Projects\projectName\Controllers\FormsController.cs:40
   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +144
   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +84
   System.Web.Mvc.Async.TaskAsyncActionDescriptor.EndExecute(IAsyncResult asyncResult) +143
   System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeAsynchronousActionMethod>b__36(IAsyncResult asyncResult) +23
   System.Web.Mvc.Async.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d() +112
   System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +452
   System.Web.Mvc.Async.<>c__DisplayClass33.<BeginInvokeActionMethodWithFilters>b__32(IAsyncResult asyncResult) +15
   System.Web.Mvc.Async.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() +32
   System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +231
   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

以下是GetByte的代码

    ControllerContext context = new    ControllerContext(Request.RequestContext, this);
    var pdf = new ViewAsPdf2("ModelClass", model);
    byte[] pdfByteArray = pdf.GetByte(context);

1 个答案:

答案 0 :(得分:0)

在做了一些研究后,我发现解决了Rotativa不能解决服务器问题的问题:

Rotativa用于生成PDF的wkhtmltopdk.exe使用以下DLL

MSVCP120.dll MSVCR120.dll

这两个dll是两个不同的可安装软件包的一部分:

  1. MSVCP120.dll 附带Visual C ++ Redistributable Packages Visual Studio 2010 64位包
    1. MSVCR120.dll 附带Visual C ++ Redistributable Packages for Visual Studio 2013 32位软件包

      如何检查rotativa使用的dll是否在正确的位置? 看起来rotativa使用的是dll C:\的Windows \ SysWOW64中

    2. 确保上述文件夹中存在MSVCP120.dll和MSVCR120.dll。我之前提到的是C:\ Windows \ System32文件夹,但是那里的dll对我没有任何好处,并进一步增加了混乱。

      希望这有帮助。