Rotativa.Netcore работает локально, но не после развертывания - PullRequest
0 голосов
/ 27 июня 2018

Я использую последнюю сборку Rotativa.NetCore в проекте ASP.NET Core 2.1.1. NuGet (https://www.nuget.org/packages/Rotativa.AspNetCore v. 1.0.6) не работает при развертывании (win2016), но работает локально (win10).

IIS при развертывании выдает 404, и журнал ошибок (стандартный вывод) показывает это:

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}

1 Ответ

0 голосов
/ 27 июня 2018

Оказывается, мне нужно было установить Microsoft Visual C++ Redistributable 2017 (x86) - скачать здесь: https://visualstudio.microsoft.com/downloads/

  1. Я вернулся к официальному nuget (для упрощения будущего обслуживания) https://www.nuget.org/packages/Rotativa.AspNetCore v. 1.0.6
  2. Я добавил RotativaConfiguration.Setup(env, "..\\Rotativa\\"); к Startup.cs
  3. Мой окончательный код выглядит так:

Код:

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