22/10/09

Tuiteros peruanos a seguir

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.

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

Saludos a todos,

José Fabricio Rojas

Nhibernate y WCF – Parte 2

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:

image

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]

image

NhibernateContext:

image

NhibernateContextExtension:

image

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.

image

Atributto: NhibernateContextAttibute

image

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

image

Aplicando el Atributo  a los servicios dentro del Contexto

image

Implementando:

image

Espero les haya gustado el post, y regreso con la Tercera parte.

Saludos desde Lima, Perú.

José Fabricio Rojas

14/10/09

Experiencias con WCF: Leer y Escribir Imágenes a través de un servicio WCF

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.

 image

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

image

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()> _
Publica Class ImagenContract

    Private _contenido As Byte()
    Private _id As String
    Private _nombre As String
    Private _tamanio As Long
    Private _fechaModificacion As DateTime?
    Private _extension As String

    <DataMember()> _
    Public Property Contenido() As Byte()
        Get
            Return _contenido
        End Get
        Set(ByVal value As Byte())
            _contenido = value
        End Set
    End Property

    <DataMember()> _
    Public Property TablaPertenencia() As String
        Get
            Return _id
        End Get
        Set(ByVal value As String)
            _id = value
        End Set
    End Property

    <DataMember()> _
    Public Property Nombre() As String
        Get
            Return _nombre
        End Get
        Set(ByVal value As String)
            _nombre = value
        End Set
    End Property

    <DataMember()> _
    Public Property Tamanio() As Long
        Get
            Return _tamanio
        End Get
        Set(ByVal value As Long)
            _tamanio = value
        End Set
    End Property

    <DataMember()> _
    Public Property FechaModificacion() As DateTime?
        Get
            Return _fechaModificacion
        End Get
        Set(ByVal value As DateTime?)
            _fechaModificacion = value
        End Set
    End Property

    <DataMember()> _
    Public Property Extension() As String
        Get
            Return _extension
        End Get
        Set(ByVal value As String)
            _extension = value
        End Set
    End Property
End Class

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”

image

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”

image

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”

image

(*) 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.

image

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

image

Después de realizado esto , pasamos a darle permisos de Escritura al usuario del IIS “IUSRS”

image

y Listo, Espero les haya ayudado tanto como a mí.

José Fabricio Rojas