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


About this entry