Header Ads Widget

Error "Unable mutex" cuando se crean archivos grandes con OpenXML

 Hace poco me encontré con un problema al generar un reporte en Excel (utilizando la librería SpreadsheetLight, que se basa en OpenXML) que tenía aproximadamente 10 mil filas, cuando el reporte a generar tenía 4 o 5 mil no habían problemas, pero al llegar a las 10 mil filas el reporte no se generaba y salía un error con el siguiente mensaje: "Unable to create mutex" y el código de la excepción era 0x80131464. Y en el texto de la excepción se mencionaba una excepción de tipo IsolatedStorage.


Nota: en el entorno de desarrollo no se presentaba este error, pero sí en el entorno de Testing y de Producción.

Claro, también puedes pensar, ¿10 mil filas en un reporte, quien revisa eso? Pero si, las cosas no siempre son como en la teoría, y no falta el cliente que necesite tener en un Excel miles de registros para manipularlos de la forma que quiere.

El error parecia referir a una falta de permisos de escritura, sin embargo, estaba usando un MemoryStream para generar los archivos, lo cual supuestamente descartaba que estaba grabando archivos en disco o necesitara permisos.

Investigando en la internet, encuentro que OpenXML utiliza el paquete System.IO.Packaging para leer y escribir documentos.

Y que a partir de archivos con peso de 8MB, este paquete de clases empieza a utilizar IsolatedStorage como carpeta temporal. Entonces, de todas maneras, si estamos utilizando el disco para generar mi reporte, esas son las cosas que uno aprende en el día a día.

Y no hay forma de "corregir" el comportamiento del paquete System.IO.Packaging, entonces habría que buscar otra solución.

Pensé inicialmente: "eso quiere decir que necesitamos asignar permisos de alguna manera a alguna carpeta temporal".

Pero el tema era que eso involucraba muchos accesos adicionales en el servidor web IIS donde estaba la aplicación, en desarrollo no había problemas, pero en testing o peor aún, en producción, involucraba solicitar demasiado.

En resumen, consistia en crear una carpeta "IsolatedStorage" en el servidor y asignarle permisos de acceso sin restricción. Los pasos detallados aquí. Lamentablemente este enlace ya no está funcionando.

Y otra solución era modificar el registro de Windows (obvio del servidor), y bueno, suerte con la charla que tengas con el administrador del servidor web, cuando le digas que tienes que modificar el registro de Windows para que tu aplicación funcione, es muy difícil convencerlos de hacer algo que afecte la seguridad del servidor.

Por suerte la solución alternativa y más rápida la encontré y era realizar una configuración adicional para el pool de la aplicación, de todas maneras era un cambio en el servidor, pero es un cambio menor en comparación con pedir ejecutar la aplicación con permisos elevados o u cambio de identidad del pool.

En sí es un procedimiento de instalación y configuración de la aplicación, que no debería afectar a las otras aplicaciones instaladas en el servidor.

La solución es ingresar a Advanced Settings (configuraciones avanzadas) del pool de la aplicación y configurar Load User Profile a True (el valor por defecto es False).

¿Que pasa cuando pones Load User Profile en True? Pues crea un perfil utilizando el nombre del pool de la aplicación, de modo que el usuario del pool tiene todos los permisos necesarios.

De ese modo, al generar el reporte ya no se genera el error "Unable to create mutex".

Publicar un comentario

0 Comentarios