Generación de PDF Rotativa trabajando localmente pero no en IIS 7
iis-7 asp.net-mvc-5 (8)
Tengo una aplicación MVC 5 ASP.NET. Tiene un formulario simple y cuando el usuario lo envía, el formulario se almacena en el caché y luego se llama a otra acción del controlador, esta acción devolverá el modelo como una vista como un PDF.
No tengo necesidad de guardarlo localmente, solo mostrarlo en el navegador para que el usuario pueda descargarlo.
Tampoco es necesaria una base de datos, por eso almaceno el modelo en la memoria caché.
A nivel local, en Visual Studio 2013, funciona bien. Pero cuando lo publico en IIS 7 obtengo un Unhandled Execution Error
. Aquí está el rastro de pila que recibo de vuelta:
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
Primero utilicé ActionAsPDF()
pero ahora también traté de usar el return new ViewAsPDF()
. Ambos dan el mismo error y el seguimiento de la pila. ¿Esto tiene que ver algo con los permisos?
Arreglé mi problema actualizando los archivos wkhtmltopdf desde el instalador que se encuentra here
¡Trabajando impecablemente ahora!
Como se menciona en los comentarios en el blog vinculado en la respuesta, puede copiar los 2 archivos dll siguientes a la carpeta rotativa
en el servidor si no desea / no puede instalar fácilmente las cosas en el servidor.
msvcr120.dll
msvcp120.dll
Si está funcionando localmente, ya debería tener disponibles los dos archivos dll. Necesita las versiones x86, si encuentra que las versiones x64 empaquetadas con vs 2015 no funcionan. He encontrado las versiones correctas aquí:
C:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/redist/x86/Microsoft.VC120.CRT
Después de actualizar a Rotativa 1.7.3 esto ya no funcionó. Tuve que copiar algunas dlls nuevas de Visual Studio 2017, las encontré aquí esta vez:
C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/redist/x86/Microsoft.VC140.CRT
y tuve que copiar encima
msvcp140.dll
vcruntime140.dll
Cuando actualicé de Rotativa 1.6.4 a 1.7.3, la conversión de PDF en la aplicación de mi sitio web dejó de funcionar y, después de ejecutar wkhtmltopdf.exe en mi servidor de producción, noté que tenía un problema con msvcp140.dll
La solución fue instalar Visual C ++ Redistributable para Visual Studio 2015 https://www.microsoft.com/en-us/download/details.aspx?id=48145
Este error es un paquete faltante de C ++ redistribuible para Visual Studio 2013 llamado (MSVCP120.dll).
Para resolver el problema:
Abra el siguiente enlace descargable del paquete redistribuible de C ++ para Visual Studio 2013: descargue los paquetes redistribuibles de Visual C ++ para Visual Studio 2013
Haga clic en Descargar y elija el archivo (vcredist_x86.exe) incluso si está ejecutando la versión del servidor de X64 bits.
Instala el archivo.
Consulte el blog de Jalal W Hijazi http://jwhijazi.blogspot.com/2015/05/solving-rotativa-unhandled-exception.html para obtener más detalles.
Instalé paquetes redistribuibles de Visual C ++ para Visual Studio 2015
https://www.microsoft.com/pt-br/download/details.aspx?id=48145
Esto se solucionó para mí.
La respuesta aceptada casi funcionó para mí. Me faltaba una versión más nueva de C ++ redistribuible, por lo que la instalación de la versión anterior no me ayudó.
La forma más sencilla de descubrir lo que se está perdiendo es ejecutar wkhtmltopdf.exe
manualmente. Le dará una salida de consola (si está funcionando) o un cuadro de mensaje sobre lo que falta.
Me faltaba MSVCP140.dll, que es de la redista de VS 2015, disponible aquí: https://www.microsoft.com/en-gb/download/details.aspx?id=48145
Me enfrenté a este problema dos veces y tiene muchas causas: 1- Tal vez falte C ++ redistributable (MSVCP120.dll) ..
2- si está alojando en un dominio específico, haga clic en grupo de aplicaciones-> haga clic en su dominio (example.net) -> configuración avanzada -> verifique su identidad en el proceso Modelo: debe iniciar sesión como usuario administrador .
Si su sitio web está en el grupo de aplicaciones predeterminado, debe hacer clic en Sitio web predeterminado-> configuración básica -> conectarse como: administrador Usuario
Me enfrenté al mismo problema. Incluso el registrador de errores no estaba registrando nada.
Después de algunas investigaciones, intenté reemplazar el wkhtmltopdf.exe
con la última versión disponible en el here web here , aún sin suerte.
Finalmente copié msvcp120.dll
y msvcr120.dll
a la carpeta en la que tenía el excutable y funcionó. (No hubo necesidad de la última versión de wkhtmltopdf.exe, en su lugar funcionó con la versión que obtuve de Nuget).
msvcp120.dll y msvcr120.dll estaban disponibles en el siguiente directorio en Windows 7.
C: / Windows / SysWOW64 /