2015-06-29 4 views
21

У меня есть приложение ASP.NET MVC 5. Он имеет простую форму, и когда пользователь отправляет его, форма сохраняется в кеше, а затем вызывается другое действие контроллера, это действие вернет модель в виде представления в виде PDF.Rotativa PDF поколение работает локально, но не на IIS 7

Мне не нужно сохранять его локально, просто чтобы показать его в браузере, чтобы пользователь мог его загрузить.

Нет необходимости в базе данных, поэтому я храню модель в кеше.

Локально, на 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(). Оба дают ту же ошибку и трассировку стека. Должно ли это что-то делать с разрешениями?

+0

это действительно бросает 'System.Exception' и не какой-то производный класс? Это было бы крайне плохо. – leppie

+0

Это все, что я получаю, и поскольку я не могу его дублировать локально, я не знаю, как отлаживать его. – Robin

+0

В первой строке стека, однако, есть параметр, который звучит так, как будто это имя пути, у меня были проблемы с путями и IIS раньше, может это проблема? – Robin

ответ

36

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

Для решения вопроса:

  1. Откройте C++ распространяемого пакета для Visual Studio 2013 загружаемой ссылки ниже: download Visual C++ Redistributable Packages for Visual Studio 2013

  2. Нажмите кнопку Загрузить и выберите файл (vcredist_x86.exe), даже если вы запущена версия сервера X64 бит.

  3. Установить файл.

Проверьте Jalal W Hijazi Блог http://jwhijazi.blogspot.com/2015/05/solving-rotativa-unhandled-exception.html для более подробной информации.

+8

Совет (по блог Jalal), который работал для меня: «Я только что скопировал msvcp120.dll и msvcr120.dll в папку, содержащую wkhtmltopdf.exe, и все отлично работало» – HugoXP

+0

@HugoXP вы должны написать это как отдельный ответ - удивительно! – fubo

+0

Текущая версия Rotativa требует Visual C++ для Visual Studio 2015 – JoeyZero

5

Я установил мой вопрос путем обновления wkhtmltopdf файлы из инсталлятора нашли here

enter image description here

Работая безотказно сейчас

+0

Ох ... и это работает на лазурном хостинге. Sever 2012 VM не локально на моем ноутбуке – jamdownian

-1

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

2- если вы хостинг в конкретном приложении выберите домен бассейн-> нажмите на свой домен (example.net) -> предварительная настройка -> Проверьте личность в процессе. Модель: вы должны войти в систему как администратор. Пользователь ..

Если ваш веб-сайт в пуле приложений по умолчанию следует щелкнуть по веб-сайту по умолчанию -> базовая настройка -> подключиться как: администратор Пользователь

5

Как указано в комментариях к блогу, связанному с ответом, вы можете просто скопировать 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 из визуальной студии 2017 года, я нашел их здесь на этот раз:

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

и я должен был скопировать

msvcp140.dll
vcruntime140.dll

+0

Это сработало для меня. На сервере я попытался включить dll x64. Однако они не фиксировали проблему. Таким образом, переключились на x86 dll, и они сработали liek обаянием. Большое спасибо. – shazia

1

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

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

Окончательно скопировано msvcp120.dll и msvcr120.dll в папку, в которой у меня была возможность, и это сработало. (Там не было никакой необходимости в последней версии wkhtmltopdf.exe, вместо того, чтобы он работал с версией, что я получил от NuGet.)

msvcp120.dll и msvcr120.dll были доступны в следующей директории в ОС Windows 7.

C: \ Windows \ SysWOW64 \

4

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

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

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

1

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

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

Смежные вопросы