Подтвердить что ты не робот

Ротатива PDF поколения работает локально, но не на IIS 7

У меня есть приложение ASP.NET MVC 5. Он имеет простую форму, и когда пользователь отправляет его, форма сохраняется в кеше, а затем вызывается другое действие контроллера, это действие вернет модель в виде представления в виде 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(). Оба дают ту же ошибку и трассировку стека. Должно ли это что-то делать с разрешениями?

4b9b3361

Ответ 1

Эта ошибка является отсутствующим С++ распространяемым пакетом для файла Visual Studio 2013, который называется (MSVCP120.dll).

Чтобы решить проблему:

Подробнее см. Jalal W Hijazi Blog http://jwhijazi.blogspot.com/2015/05/solving-rotativa-unhandled-exception.html.

Ответ 2

Как упоминалось в комментариях к блогу, связанному с ответом, вы можете просто скопировать 2 следующих файла dll в папку rotativa на сервере, если вы не хотите/не можете легко установить вещи на сервер.

msvcr120.dll
msvcp120.dll

Если он работает локально, вы должны уже иметь два файла dll. Вам нужны версии x86, если вы найдете версии x64, упакованные в vs 2015, они не работают. Я нашел правильные версии здесь:

C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\redist\x86\Microsoft.VC120.CRT

После обновления до Rotativa 1.7.3 это больше не работало. Мне пришлось копировать некоторые новые dll из visual studio 2017, я нашел их здесь на этот раз:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\redist\x86\Microsoft.VC140.CRT

и мне пришлось копировать

msvcp140.dll
vcruntime140.dll

Ответ 3

Я исправил свою проблему, обновив файлы wkhtmltopdf из установщика, найденного здесь

enter image description here

Теперь работаем безупречно!

Ответ 4

Принятый ответ почти сработал у меня. Мне не хватало более новой версии распространяемого на С++, поэтому установка старой версии не помогла.

Самый простой способ узнать, чего вам не хватает, - запустить wkhtmltopdf.exe вручную. Это либо даст вам консольный вывод (если работает), либо окно с сообщением о том, что отсутствует.

Мне не хватало MSVCP140.dll, который находится в редакторе VS 2015, доступный здесь: https://www.microsoft.com/en-gb/download/details.aspx?id=48145

Ответ 5

Я столкнулся с той же проблемой. Даже регистратор ошибок ничего не записывал.

После некоторых исследований я попытался заменить wkhtmltopdf.exe на последнюю версию, доступную на веб-сайте wkhtmltopdf.org, но до сих пор не повезло.

Наконец скопировали msvcp120.dll и msvcr120.dll в папку, в которой у меня была функция excutable, и она сработала. (Не было необходимости в последней версии wkhtmltopdf.exe, вместо этого она работала с версией, полученной от Nuget.)

msvcp120.dll и msvcr120.dll были доступны в каталоге ниже в Windows 7.

C:\Windows\SysWOW64\

Ответ 6

Когда я обновился с Rotativa 1.6.4 до 1.7.3, мое преобразование PDF на моем веб-сайте перестало работать, и после запуска wkhtmltopdf.exe на моем рабочем сервере я заметил, что у него возникла проблема с msvcp140.dll

Решение заключалось в установке Visual С++ Redistributable для Visual Studio 2015 https://www.microsoft.com/en-us/download/details.aspx?id=48145

Ответ 7

Я столкнулся с этой проблемой дважды, и у нее много причин: 1- Возможно, вам недостает С++, распространяемого (MSVCP120.dll)..

2, если вы размещаете в определенном домене, щелкните пул приложений приложения → щелкните на своем домене (example.net) → параметр предварительной настройки → Проверьте личность в процессе. Модель: вы должны войти в систему как Администратор Пользователь..

если на вашем веб-сайте по умолчанию используется пул приложений, вы должны нажать на веб-сайт по умолчанию → базовые настройки → подключиться как: пользователь пользователя