Bueno, después de la iniciativa de @ebersys y de @fabianfigueredo, publico un post con programadores/desarrollares/profesionales TI peruanos que podemos seguir via twiter.
Saludos a todos,
Blog Técnico de Desarrollo de Aplicaciones en .NET Framework
Bueno, después de la iniciativa de @ebersys y de @fabianfigueredo, publico un post con programadores/desarrollares/profesionales TI peruanos que podemos seguir via twiter.
Saludos a todos,
Buenas con todos, esta es la continuación del post “Nhibenate y WCF – Parte 1” quedaron muchas cosas pendientes en el tintero y espero que esta 2da parte ayude mucho más.
Previo:
Hace unas semana Fabio Maulo, Team Leader de Nhibernate publicó en su blog un post donde incorpora una nueva feature al proyecto uNhAddins para Aplicaciones WCF, Esta nueva feature nos ahorra mucho trabajo al usar Nhibernate y WCF y soluciona el problema que por ejemplo a mí se me presento y cuyo fin es este post. Espero en unos días próximos usar esta feature e incorporarlo a mi proyecto demo y claro postearlo también.
Previo: Cuando construimos una aplicación web y decidimos usar Nhibernate como Capa de Persistencia, Nhibernate nos provee de una configuración para optimizar su uso en una aplicación bajo la web, esta configuración esta presente en la propiedad:
Esto en la sección de configuración de Nhibernate, Implementando el patrón de Session per request, Creamos una Sesión de Nhibernate por cada request que se hace a la aplicación , para más detalles en darle una mirada a la Clase NhibernatHelper en este post; todo esto en una aplicación web , Pero un servicio WCF no funciona de la misma manera, es decir en un servicio no puede tomar el objeto HttpContext para encapsular dentro de él a la sesión de Nhibernate. Un servicio no tiene un HttpContext , un servicio más bien un Contexto de Operación, es decir cada vez que un servicio sea consumido se creará una Sesión, y se encapsulara la sesión de nhibernate en esa Operación.
En el post de Fabio, Él implementa todo eso el misma propiedad donde se configura a la aplicación como “web”, En este post, se hace a mano.
NhibernateContext: Esta implementación le pertenece a Donald Belcham en su post podrán la descripción de la implementación en ingles.
Clase utilizadas para la implementación del Atributo: [NhibernateContext]
NhibernateContext:
NhibernateContextExtension:
NhibernateContextInitializer:
Aquí es importante mencionar que cada vez que se usar un servicio se inicializa el Contexto de la Operación y por consiguiente se Abre una crea una sesión de Nhibernate.
Atributto: NhibernateContextAttibute
Cambiando nuestro NhibernateHelper: con estas líneas de código solo estamos haciendo que nuestro Helper funcione solo con los servicios, para hacer que nuestro helper trabaje con la Aplicación Web y los Servicios darle una mirada a la demo colgada en codeplex
Aplicando el Atributo a los servicios dentro del Contexto
Implementando:
Espero les haya gustado el post, y regreso con la Tercera parte.
Saludos desde Lima, Perú.
1.- Crear un nuevo servicio WCF, para esto vamos a Proyectos en VB->Web->WCF Service Application, le ponemos el nombre que gustamos, seguidamente nos crea un esquema de básico de un servicio WCF.
Bueno , para no hacernos tantas bolas de frente escribiremos en el “Service1” que nos provee la plantilla,
2.- Crear nuestros Métodos de Operaciones de Servicio “OperationContract” en nuestro Contrato
3.- Se pueden pasar imágenes por un servicio de distintas maneras en mi caso opte por pasar las imágenes mediante un Arreglo de Bytes, también debido que necesitaba puntual información de la Imagen ,decidí crearme una clase “DataContract” a la cual llamé “ImagenContract”
| <DataContract()> _ Private _contenido As Byte() <DataMember()> _ <DataMember()> _ <DataMember()> _ <DataMember()> _ <DataMember()> _ <DataMember()> _ |
4.- Implemento la Interfaz de Servicio y toda la Lógica que necesita para los Métodos:
SaveImage: Se Crea el archivo a partir de la ruta del disco, le asigno un tamaño y partir del Método “Create” obtengo un Stream, teniendo el Stream y atreves del objeto BinaryWriter escribo en ese objeto el arreglo de bytes almacenados en la propiedad “Contenido”
LeerImagen: Cargo la imagen, verifico si existe el archivo, creo un Stream y a través del objeto BinaryReader obtengo el arreglo de bytes y lo almaceno en la propiedad “Contenido”
Hasta aquí lo implementado no escapa a nada de lo normal , sin embargo cuando queremos exponer el servicio para consumirlo se presentan varias dificultades, las que se me presentaron a mi fueron como: La Seguridad el servicio detenta inseguro el traspaso el arreglo de bytes, El Tamaño seteado en la propiedad “maxArrayLength” que por defecto puede ser muy inferior al tamaño en bytes de la imagen que deseamos pasar por el arreglo.
Para evitar estos problemas, elegí como Tipo de Binding de Servicio a “basicHttpBinding”, así también como “None” en la seguridad y aumentamos el Tamaño de “maxArrayLength”
(*) El Nombre del proyecto para esta demo en mi caso es “OracleTxAdoNet” si van a cambiar el Nombre del proyecto , fijarse en cambiar también la configuración del servicio.
Para consumir el servicio podemos utilizar el Wizard de VS, seleccionando nuestro proyecto Click Derecho->Add Service Reference y referenciando el servicio a través de la URL nos generará un Clase Cliente y un app.config con la configuración cliente para consumir el servicio, a esta configuración solo tendríamos que revisar la propiedad “maxArrayLength” y aumentar su tamaño.
Para hostear en este servicio en el IIS, tendría que tomar algunas consideraciones como Activar las “Características del Net Framework 3.0”->Activación WCF-> Activación HTTP todo esto en la Opción “Administrador del servidor”, menciono que en mi caso lo estoy hosteando en un Windows Server 2008
Después de realizado esto , pasamos a darle permisos de Escritura al usuario del IIS “IUSRS”
y Listo, Espero les haya ayudado tanto como a mí.