Я использую последнюю сборку 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}