Ротатива 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()
. Оба дают ту же ошибку и трассировку стека. Должно ли это что-то делать с разрешениями?
Ответы
Ответ 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) → параметр предварительной настройки → Проверьте личность в процессе. Модель: вы должны войти в систему как Администратор Пользователь..
если на вашем веб-сайте по умолчанию используется пул приложений, вы должны нажать на веб-сайт по умолчанию → базовые настройки → подключиться как: пользователь пользователя