martes, 19 de enero de 2010

GetTempFileName y Trust Levels


No hace mucho tuvimos que lidiar con los problemas de ciertas librerías de .Net cuando trabajan en niveles de seguridad restringidos en un servidor de alojamiento compartido, concretamente uno de ellos fue el método System.IO.Path.GetTempFileName() que devuelve un fichero temporal único que puede ser utilizado para tareas varias.

Pues bien, en un alojamiento compartido dónde no disponemos de un Trust Level el método anterior provoca una excepción de seguridad y no puede ser utilizado.

En nuestro caso este método lo utilizábamos para generar un xml provisional en disco que posteriormente era transformado mediante XSLT en un fichero .fo listo para ser impreso con el Apache FOP (recompilado a .Net en nuestro caso, y que también provoca problemas de seguridad en estos niveles, pero eso lo veremos otro día).

El problema, una aplicación Web puede generar gran cantidad de peticiones, por lo que de algún modo se debe asegurar que todas ellas obtendrán un fichero temporal con un identificador único.

Una solución pasaba por almacenar en BBDD un identificador que se actualizase bajo transacción en cada petición, pero no podía ser que necesitaramos una BBDD para esto, podría ser en ciertos casos que no la tuviésemos disponible.

Pensando se nos ocurrieron dos ideas para generar identificadores de fichero únicos, una utilizar algún método que nos devuelva un GUID, que seguro que .Net lo tiene, pero como no lo recordábamos y no nos apetecía abrir Google, pensamos en la segunda opción, que es utilizar el número de Ticks del timer, es decir, el contador de tiempo desde el comienzo de los tiempos (o desde alguna fecha fija en el pasado que no alcanzo a recordad), pero que en cualquier caso es único ya que como todos bien sabemos, pese a nuestro pesar, el tiempo siempre va hacia delante.

Pues ahora quedaba efectuar los cambios. En primer lugar, crear un método GetTempFileName() tal que retorne un String con el contenido de DateTime.Now.Ticks.ToString(), y segunda quitar las referencias a System.IO.Path, de manera que el cambio sea lo menos traumático posible para el código (y el programador).

Espero os sea de ayuda, no nos costó mucho pensarlo, pero las piernas nos temblaron inicialmente al ver la excepción de seguridad. Como siempre, con un poco de ingenio e intuición, todo sale.

No hay comentarios:

Publicar un comentario