Buenos días a todos.
Tengo una aplicación web que debe validar facturas, con formato eFactura, contra una serie de xsd (una lista variable según algunas características de la factura). El principal es el "schemaformato31.xsd", un fichero stándar de validación de facturas y el principal motivo del problema, que es LA DURACIÓN.
Para validar la factura creo un objeto ReaderSettings
XmlReaderSettings ReaderSettings = new XmlReaderSettings();
ReaderSettings.ValidationType = ValidationType.Schema;
ReaderSettings.ValidationFlags = XmlSchemaValidationFlags.ProcessSchemaLocation |XmlSchemaValidationFlags.ReportValidationWarnings |
XmlSchemaValidationFlags.AllowXmlAttributes;
...que luego es un parámetro de la función predefinida para pre-compilar los esquemas:
XmlReader.Create(RutaEsquemaXsd, ReaderSettings)
El primer problema y principal es que esta línea tarda entre 60 y 90 segundos en procesarse.
¿Es normal?
A esto hay que añadir que, comparar luego cada xml de una factura con la lista de schemas creada, lleva otros 30 segundos; en total son como 2 minutos por factura y ello provoca a veces que el proceso se aborte por error en la conexión:
"Se ha terminado la conexión: La conexión ha terminado de forma inesperada."
Segundo problema: estoy en un servicio web. Intento guardar este objeto, los XmlReader que se van creando (para no crearlos para cada factura, sino aprovechar los que, para cada tipo de factura, se hayan procesado ya), pero resulta que NO SON SERIALIZABLES -si lo fueran ser resolverían todos mis problemas-. Por ello, he probado a guardarlo en caché y en el objeto Application. He activado las sesiones para este webmethod ( [WebMethod(EnableSession=true)]), pero el objeto sólo se mantiene dos horas. Luego se destruye sin que sepa por qué. Y la siguiente factura vuelve tardar dos minutos en validarse, eso cuando no da error de conexión.
En web.config, SessionState tiene un timeout de 4320 minutos, es decir dos semanas (que debiera ser lo que estuviera almacenado el objeto en memoria; no dos horas).
El web.config del programa que llama al servicio tiene la variable executionTimeout de la sección httpRuntime en 600 minutos (10 horas, no 2).
¿Por qué se destruye la variable de aplicación a los 120 minutos?
Cualquier sugerencia es bienvenida
Un saludo