Open Session In View - IIS7 - Spring .Net

Holas a todos

Volviendo a escribir un artículo que, a recomendación de un amigo, podría ayudar a muchos con este problema que siempre ocurre al utilizar Spring .Net + Open Session in View design pattern + IIS7.

Vamos por lo primero, el patrón Open Session in View, según Hibernate este patrón consiste en mantener la sesión de Hibernate(aunque en el caso de .Net es NHibernate) abierta hasta que se realice la renderización de la vista.

Ahora, por qué existe este patrón? La respuesta es simple, muchos que hemos usado Nhibernate podemos notar que cuando tenemos un objeto que tiene relación one-to-many (o cualquier otro tipo de relación) con otro objeto, y queremos acceder a este último al momento de estar en el code-behind, nos aparece el clásico error "LazyInitializationException".

El patrón Open Session In View, tal como se mencionó anteriormente, permite solucionar este problema al mantener la sesión abierta hasta la renderización de la vista.

Ahora, la historia, tal como mencioné en la conferencia de Spring Live Perú 2009, me encuentro en un proyecto de .Net (framework 3.5) en el cual estoy cumpliendo cierto papel de arquitecto. En este proyecto estamos utilizando Spring .Net, NHibernate y AjaxToolkit. Entonces un día nació la necesidad de usar el patrón Open Session in View, todo bien en el sitio donde desarrollábamos, pero al momento de probarlo en un IIS7 ocurría un problema muy extraño, aún seguía saliendo el error de "LazyInitializationException". Lo cual fue muy extraño, pues si estaba solucionado en nuestras laptops cuando probábamos, entonces qué razón había para que no funcione en el servidor?

Entonces, como todo problema, se intentó buscar la solución a esto pero no había mucha información del problema, hasta que pude dar con el problema en este sitio
donde nos indicaban cambiar el módulo de Open Session In View de system.web/httpModules a system.webserver/modules. Es decir, tenemos que pasar esta línea de código:

<httpModules>
<add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate20"/>
</httpModules>

a la siguiente posición:

<modules>
<add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate20"/>
</modules>

Pero hay que tener mucho cuidado con esto, porque el sitio menciona el mover de httpModules a modules. Pero no debemos cortar y pegarlo, porque esto ocasionaría que funcione en el servidor IIS7, pero no en nuestras máquinas de desarrollo. Por lo tanto deberían tenerlo replicado tanto en los modules como en los httpModules.

Y listo, con esto podrán usar el patrón Open Session In View para NHibernate integrado con Spring .Net, y funcionará tanto para IIS7, como para el IIS6.

Espero les pueda servir esto a muchos para solucionar problemas tan particulares que se tienen con el IIS7.

Enjoyt it

Shinji