Consumiendo Web Services en Workflow Foundation

Hasta este momento hemos visto y explicado una gran cantidad de funcionalidad de Workflow Foundation implementada en varias actividades que vienen incluidas, y en este capítulo explicaremos una más: la actividad InvokeWebService la cual nos permite realizar la invocación a un servicio Web XML y de esa manera extender la funcionalidad de nuestros flujos de trabajo.

Si bien está fuera de alcance en este capítulo explicar a detalle el funcionamiento de los servicios Web, debemos recordar que son componentes implementados en servidores Web y que exponen una serie de funcionalidades que podemos utilizar y reutilizar en nuestras aplicaciones que desarrollemos.

Para demostrar lo fácil que es consumir servicios Web desde nuestros flujos de trabajo en Workflow Foundation, iniciemos abriendo Visual Studio .NET y creemos una nueva aplicación de consola de flujo de trabajo secuencial. Esto lo logramos seleccionado la plantilla "Sequential Workflow Console Application" en la ventana de New Project de Visual Studio .NET. A esta solución le pondremos el nombre de ConsumiendoWebServices tal y como lo muestra la siguiente figura:

A nuestro proyecto le agregaremos un nuevo sitio Web de tipo ASP.NET Web Service y le pondremos el nombre WSPrueba. Este será el sitio en donde desarrollaremos un servicio Web de prueba para demostrar la invocación desde un flujo de trabajo. Cuando creamos un proyecto de este tipo automáticamente Visual Studio .NET agrega un servicio Web llamado Service.asmx y su archivo de code-behind relacionado Service.asmx.cs. Nuestro servicio Web tendrá un método público que regresará el día de la semana actual, para esto necesitamos implementar el siguiente código:

 1: [WebMethod]
 2: public string RegresaDiaDeLaSemana()
 3: {
 4: return DateTime.Now.DayOfWeek.ToString();
 5: } 

Recordemos que aquellos métodos que deseamos invocar a través del servicio Web deberán estar decorados con el atributo WebMethod y tener el modificador de acceso public

Ahora bien, en el diseñador de nuestro flujo de trabajo agreguemos una actividad de tipo InvokeWebService. Al hacer esto Visual Studio .NET automáticamente nos presenta la caja de diálogo Add Web Reference –la misma que se muestra al agregar una referencia Web en cualquier tipo de proyecto-. El objetivo de esta caja de diálogo es indicar cuál es el servicio Web que deseamos invocar por medio de la actividada InvokeWebService. En nuestro caso seleccionaremos "Web Services in this solution" ya que esta opción buscará los servicios Web implementados en la misma solución. Una vez seleccionada esta opción, la caja de diálogo nos muestra una lista con los servicios Web encontrados y posteriormente seleccionaremos el servicio llamado "Service" el cual es el que creamos en los párrafos anteriores. Al hacer clic en este servicio, la caja de diálogo nos muestra su detalle completo. La siguiente figura muestra la caja de diálogo desplegando el detalle de Service.asmx:

Hagamos clic en el botón Add Reference. Como es esperado, Visual Studio .NET agrega al proyecto de nuestro flujo de trabajo la referencia Web correspondiente al servicio seleccionado. Además de lo anterior la actividad InvokeWebService es mostrada en el diseñador. No obstante, a este momento aún no hemos configurado dicha actividad, lo cual requiere establecer la propiedad MethodName que indica el método del servicio Web que se va a ejecutar. En la ventana de propiedades MethodName se muestra como una lista desplegable, la cual al hacer clic sobre ella muestra la lista de todos los métodos disponibles en el servicio. En nuestro caso seleccionaremos RegresaDiaDeLaSemana. Al seleccionar dicho método la ventana de propiedades es actualizada mostrando una nueva propiedad llamada (ReturnValue). Esta propiedad nos permite mapear el valor de retorno del método a alguna propiedad o campo dentro de nuestro flujo de trabajo; esto lo podemos lograr al hacer clic en el botón de tres puntos "…" en la propiedad (ReturnValue) y configurar el mapeo, en nuestro caso, a un campo llamado "resultado". El mismo mecanismo de asignación es usado para cuando el método Web requiere parámetros. La siguiente figura muestra la actividad InvokeWebService configurada:

Muy bien, ahora para probar la invocación del servicio Web agreguemos una actividad de tipo Code al diseñador del flujo de trabajo. A esta actividad le relacionaremos el método Consulta en su propiedad ExecuteCode tal y como lo muestra la siguiente figura:

El método Consulta tendrá el siguiente código, el cual muestra el resultado de la invocación de nuestro servicio Web:

 1: private void Consulta(object sender, EventArgs e)
 2: {
 3: Console.WriteLine(resultado);
 4: } 

Hemos finalizado. Para probar nuestro trabajo ejecutemos nuestra aplicación haciendo clic en Ctrl-F5 o haciendo clic en el menú Debug->Start Without Debugging. Dependiendo del día en el que se esté ejecutando el código, el resultado nos mostrará el día correcto de la semana tal y como lo podemos corroborar en la siguiente figura: