Rotativa.Netcore可以在本地正常工作,但部署后无法正常工作。

3

我正在一个ASP.NET Core 2.1.1项目中使用最新的Rotativa.NetCore组件。NuGet (https://www.nuget.org/packages/Rotativa.AspNetCore v. 1.0.6) 在部署(win2016)时无法工作,但在本地(win10)上可以。

在部署时,IIS报404错误,错误日志(stdout)显示如下:

fail: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1]
      An unhandled exception has occurred while executing the request.
System.Exception
   at Rotativa.AspNetCore.WkhtmlDriver.Convert(String wkhtmlPath, String switches, String html, String wkhtmlExe)
   at Rotativa.AspNetCore.WkhtmltopdfDriver.ConvertHtml(String wkhtmltopdfPath, String switches, String html)
   at Rotativa.AspNetCore.ViewAsPdf.CallTheDriver(ActionContext context)
   at Rotativa.AspNetCore.AsResultBase.BuildFile(ActionContext context)
   at Rotativa.AspNetCore.AsResultBase.ExecuteResultAsync(ActionContext context)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeResultAsync(IActionResult result)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResultFilterAsync[TFilter,TFilterAsync]()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResultExecutedContext context)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeResultFilters()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()
   at Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.Invoke(HttpContext context)

这是'myproject'的源代码

public IActionResult DownloadCertificate(int id)
{
    var model = getData(id);
    return new ViewAsPdf("PdfCertificate", model)
    {
        WkhtmlPath = "", // set the path to the Rotativa .exe files. works locally but not on deployment. 
        FileName = "Cert.pdf"
    };
}

我尝试将 WkhtmlPath 更改为 "..\\Rotativa\\",但没有成功。
在排除故障时,我发现:https://stackoverflow.com/a/48166956/560784 - 显然 Rotativa 是针对 .NET Core 1.0 编译的:

这里有更新 Rotativa.NetCore 从.NET Core 1升级到.NET Core 2.0 的代码: https://github.com/aaxelm/Rotativa.NetCore/pull/1/files?diff=split

所以,我下载了 Rotativa 源代码并相应地更新到 .NET core 2.0,引用了新的程序集。问题仍然存在。
我也检查了权限。Rotativa 文件夹授予 IIS_IUSRS 执行权限(运行 ApplicationPoolIdentity)。
我错过了什么?
我的本地文件夹结构:

c:\inetpub\myproject\myproject.dll + web.config 和其他文件。 c:\inetpub\myproject\Rotativa{wkhtmltoimage.exe、wkhtmltopdf.exe、wkhtmltox.dll}

我的部署文件夹结构:

c:\inetpub\sites\myproject\myproject.dll + web.config 和其他文件。 c:\inetpub\sites\myproject\wwwroot\(静态文件) c:\inetpub\sites\myproject\Rotativa{wkhtmltoimage.exe、wkhtmltopdf.exe、wkhtmltox.dll}

3个回答

8
原来我需要安装 Microsoft Visual C++ Redistributable 2017 (x86) - 可在此下载:https://visualstudio.microsoft.com/vs/older-downloads/https://visualstudio.microsoft.com/downloads/
  1. 我回退到了官方的 nuget(为了更方便地维护)https://www.nuget.org/packages/Rotativa.AspNetCore 版本为 1.0.6
  2. 我在 Startup.cs 中添加了 RotativaConfiguration.Setup(env, "..\\Rotativa\\");
  3. 我的最终代码如下:

代码:

public IActionResult DownloadCertificate(int id)
{
    var model = getData(id);
    return new ViewAsPdf("PdfCertificate", model)
    {
         FileName = "Cert.pdf"
    };
}

1
可以从 https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads 下载。 - Devesh

2

我在使用asp netcore3.1开发项目时遇到了同样的问题,安装了“Microsoft Visual C++ Redistributable 2017 (x86)”后问题得以解决。请确保安装了(x86)版本,无论您的操作系统是x64还是x86!谢谢Sha!!


0
对我来说,我只需要在服务器上安装Microsoft Visual C++ Redistributable 2017 (x86)。之前我尝试过其他解决方案,包括在本地主机上安装它们,但都没有成功,我几乎放弃了!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接