Servicios Web Asíncronos

Fecha: 28/Mar/2005 (20/Marzo/ 2005)
Autor: Héctor M Ochoa Jácome  herko8a@hotmail.com

 


 

Introducción

Los servicios web, ayudan a que nuestras aplicaciones se comuniquen con recursos externos, que facilitan el desarrollo de las mismas. Ya sean servicios web programados por nosotros mismos, o servicios proporcionados por compañías o sitios públicos.

Uno de los temas principales que nos aquejan, a la hora consumir este tipo de servicios, es el tiempo en que estos nos devuelven una respuesta, existen factores como el tráfico en la red y la velocidad de conexión, que hacen que este tiempo de espera se de, de forma variable.

 

Ejemplo

Imaginen una tienda de autoservicios, que necesita transmitir la información relacionada con una venta a una base de datos central que se encuentra en un sitio remoto. En este servidor remoto, se encuentra implementado un servicio web, que recibe la información referente a la venta y la almacena en la base de datos central, dependiendo de las condiciones de velocidad de transmisión y del volumen de la venta, este servicio web, puede tardar en regresar una respuesta un número indeterminado de tiempo, sin embargo se requiere que la aplicación local, se encuentre disponible para seguir con la siguiente venta.

La forma de continuar trabajando, sin la necesidad de esperar hasta que el servicio web termine de trabajar y nos regrese la confirmación de que la venta fue guardada, es mediante la utilización de servicios web asíncronos del lado del cliente.

Cuando agregamos en nuestro proyecto una referencia web, Visual Studio genera un Proxy que es capaz de hacer llamadas a servicios web de forma sincronía o asíncrona, por lo que no es necesario que realicemos ninguna configuración especial en el servicio web, para soportar una llamada asíncrona.

Por cada uno de los métodos contenidos en nuestro servicio web, el Proxy genera dos métodos correspondientes al inicio y al fin de la ejecución de este.

Por lo que si en nuestro ejemplo contamos en el servicio web con un método llamado “RecibeVenta” el Proxy generara automáticamente “BeginRecibeVenta” y “EndRecibeVenta”, la primera “Begin” inicia la llamada al servicio web, y la segunda “End” completa la llamada al servicio web y retorna la respuesta.

Para nuestro ejemplo, imaginemos que tenemos agregado a nuestro proyecto el servicio web llamado wsCentral que contiene el método web RecibeVenta.

 

 

 

Para hacer más interesante este ejemplo, digamos que la venta que submitimos mediante el método web “RecibeVenta” es un documento XML formado de la siguiente forma.

 

<Venta>
          <Tienda></Tienda>
          <NoVenta></NoVenta>
          <Fecha></Fecha>
          <NoArticulos></NoArticulos>
          <MontoTotal></MontoTotal>
     

          <VentaDetalle>
               <CveProducto>
</CveProducto>
               <Cantidad></Cantidad>
               <Precio></Precio>
          </VentaDetalle>

          <VentaDetalle>
               <CveProducto>
</CveProducto>
               <Cantidad></Cantidad>
               <Precio></Precio>
          </VentaDetalle>

</Venta>


Una vez que es realizada una venta, la función principal genera el documento XML anterior, e invoca a la función SubmiteVenta, a la cual pasa como parámetro una variable de tipo string que contiene el documento XML.

La función SubmiteVenta, invoca de forma asíncrona al servicio web, y al terminar continua con la ejecución del programa para la siguiente venta.

Aquí el código...


Visual Basic .Net

' Esta función recibe un documento XML con el detalle de una venta
' e invoca de forma asíncrona el servicio web wsCentral.

Private Sub SubmiteVenta(ByVal strXML As String)
    ' Creamos una instancia del servicio web
    Dim wsSubmitVenta As New wsCentral.wsDBCentral()
   
' Creamos un objeto de tipo AsyncCallback que nos permite indicar el método
    ' a ser invocado una vez que la llamada asíncrona al web method es completada.

   
Dim AsyCB As New AsyncCallback(AddressOf EsperaRespuesta)
   
    ' Utilizamos el método Begin generado por el Proxy para submitir el documento XML 
    ' Así mismo pasamos los objetos AsyCB que le indica a que método invocar una vez
    ' que la operación es completada.

    wsSubmitVenta.BeginRecibeVenta(strXML, AsyCB, wsSubmitVenta)
End Sub

' Función que es invocada cuando el servicio web termina su trabajo.
' recibe como parámetro un objeto de tipo IAsyncResult que contiene
' el resultado de la operación ejecutada de forma asíncrona
Private Sub EsperaRespuesta(ByVal AsyRes As IAsyncResult)
    ' Creamos una instancia del servicio web
   
Dim wsSubmitVenta As New wsCentral.wsDBCentral()
    Dim Respuesta As Integer

    ' Recuperamos los valores devueltos por el servicio web
    wsSubmitVenta = AsyRes.AsyncState

    ' Utilizamos el método End generado por el Proxy para recuperar la Respuesta
    ' del Método Web SubmitVenta.

    Respuesta = wsSubmitVenta.EndRecibeVenta(AsyRes)

End Sub


ir al índice