Rodrigo Díaz Concha

.NET, Technology, Music, Art, Culture, Traveling, Fun...

Publicando Flujos de Trabajo de Workflow Foundation como Servicios Web

Publicando Flujos de Trabajo de Workflow Foundation como Servicios Web

Una de las características más novedosas y útiles que podemos encontrar al desarrollar flujos de trabajo con Workflow Foundation es su capacidad de exponer nuestros flujos como servicios Web y usarlos en cualquier tipo aplicaciones. En este capítulo veremos qué se requiere para realizar esta funcionalidad y también veremos cómo invocar nuestros flujos de trabajo como servicios Web desde una aplicación de consola.

Para iniciar, abramos Visual Studio .NET si es que no está ejecutándose ya y creemos un nuevo proyecto de tipo consola haciendo clic en la opción New Project y seleccionando la plantilla Console Application de la categoría Windows. A esta aplicación le asignaremos el nombre AplicacionCliente y nos servirá para invocar el web Service que expondrá la funcionalidad del flujo de trabajo. La siguiente figura muestra la caja de diálogo New Project al crear nuestro proyecto:

A la solución agregaremos un nuevo proyecto de tipo Sequential Workflow Library haciendo clic derecho sobre la solución en Solution Explorer y seleccionando la opción Add->New Project. En la caja de diálogo seleccionemos la plantilla Sequential Workflow Library de la categoría Workflow y asignemos "WorkflowEjemplo" como nombre. La siguiente figura muestra la creación de este proyecto:

Ahora bien, necesitamos definir una interface la cual nos servirá para establecer el conjunto de métodos que nuestro servicio Web expondrá. Para realizar esto hagamos clic derecho sobre el proyecto WorkflowEjemplo en Solution Explorer y seleccionemos la opción Add->New Item del menú. Al hacer esto Visual Studio .NET despliega la caja de diálogo Add New Item con una serie de plantillas a escoger y una caja de texto para asignar el nombre del nuevo elemento. Seleccionemos la plantilla Interface del panel derecho y asignemos "IEjemplo.cs" como nombre de la nueva interfaz. La siguiente figura muestra la caja de diálogo Add New Item al agregar el nuevo elemento:

Al hacer clic en Ok Visual Studio .NET nos muestra el diseñador de código de la interfaz agregada. Asignemos el siguiente código en IEjemplo.cs:

public interface IEjemplo
{
    string RegresaSignoZodiacal(DateTime fechaNacimiento);
} 

Una vez definida la interfaz para nuestro servicio Web, regresemos al diseñador del flujo de trabajo y arrastremos y coloquemos una actividad de tipo WebServiceInput, la cual indica al flujo de trabajo que obtendrá una solicitud externa a través de una aplicación, es decir, que será invocado como un servicio Web. La actividad WebServiceInput debe ser configurada, siendo su propiedad InterfaceType su propiedad más importante. Esta propiedad indica el tipo de interfaz relacionada con esta actividad y para este ejemplo usaremos la interfaz IEjemplo creada en los párrafos anteriores. Para asignar la interfaz IEjemplo a la propiedad InterfaceType hagamos clic en el botón con tres puntos "…" en la ventana de propiedades de Visual Studio .NET. Al hacer clic sobre ese botón se despliega la siguiente caja de diálogo:

En esta caja de diálogo seleccionemos la interfaz WorkflowEjemplo.IEjemplo (la cual es la única interfaz en nuestro proyecto) y hagamos clic en el botón Ok.

La siguiente propiedad que debemos configurar es MethodName, la cuál como podemos deducir será RegresaSignoZodiacal. Al seleccionar este método de la lista desplegable automáticamente la ventana de propiedades se actualiza para mostrarnos fechaNacimiento en la lista. Esta nueva propiedad la debemos mapear a un campo o propiedad en nuestro flujo de trabajo para tener acceso al dato pasado como parámetro cuando se esté invocando este servicio Web. Seleccionemos la propiedad fechaNacimiento y hagamos clic en la opción "Bind Property 'fechaNacimiento'" en el panel de opciones de la parte inferior de la ventana de propiedades y en la caja de diálogo generemos un nuevo miembro de tipo campo llamado fechaNacimiento tal y como lo muestra la siguiente figura:

La última propiedad que configuraremos de la actividad WebServiceInput será IsActivating la cual indica si esta actividad activará el flujo de trabajo.

Agreguemos ahora una actividad de tipo IfElse a nuestro diseñador, y como expresión condicional en la rama izquierda asignemos un Code Condition llamado EsFechaValida. Este método validará que la fecha que asigne el usuario como parámetro no sea mayor que la fecha actual. El código entonces para este método será el siguiente:

private void EsFechaValida(object sender, ConditionalEventArgs e)
{
    e.Result = fechaNacimiento <= DateTime.Now.Date ? true : false;
} 

Como paso siguiente agreguemos una actividad de tipo Code en la rama izquierda de la actividad IfElse y una actividad de tipo WebServiceOutput. A la actividad Code le asignaremos en su propiedad ExecuteCode el método CalculaSigno, y a la actividad WebServiceOutput le asignaremos en su propiedad InputActivityName el nombre de nuestra actividad WebServiceInput (webServiceInputActivity1). Al hacer lo anterior la ventana de propiedades se actualiza para mostrarnos una nueva propiedad llamada ReturnValue. Esta propiedad la mapearemos a un nuevo miembro de tipo field llamado resultado.

En la rama derecha de la actividad IfElse arrastraremos y colocaremos una actividad de tipo WebServiceFault con su propiedad InputActivityName mapeada a webServiceInputActivity1 y su propiedad fault a un nuevo miembro de tipo field llamado fault.

La siguiente figura muestra todo el flujo de trabajo configurado e implementado:

El siguiente código muestra el método CalculaSigno el cuál contiene una implementación muy sencilla para calcular el signo zodiacal según la fecha especificada en el parámetro:

private void CalculaSigno(object sender, EventArgs e)
{
    switch (fechaNacimiento.Month)
    {
        case 1:
            resultado = fechaNacimiento.Day <= 21 ? "Capricornio" : "Acuario";
            break;
        case 2:
            resultado = fechaNacimiento.Day <= 19 ? "Acuario" : "Piscis";
            break;
        //Otros meses… 
    }
} 

Visual Studio .NET nos brinda una manera muy sencilla de exponer nuestros flujos de trabajo como servicios Web: simplemente hagamos clic derecho sobre el proyecto del flujo de trabajo y seleccionemos la opción "Publish as Web Service". Al hacer esto Visual Studio .NET creará automáticamente un proyecto Web en nuestra solución el cual contiene el servicio Web que expone la funcionalidad del flujo de trabajo.

Finalmente, en la aplicación de consola agreguemos la referencia Web apuntando al proyecto que se creó en el párrafo anterior y en el método Main() escribamos el siguiente código:

static void Main(string[] args)
{
    Console.WriteLine("Escriba su fecha de nacimiento: ");
 
    DateTime fechaNacimiento = Convert.ToDateTime(Console.ReadLine());
 
    localhost.Workflow1_WebService ws = new AplicacionCliente.localhost.Workflow1_WebService();
 
    Console.WriteLine(ws.RegresaSignoZodiacal(fechaNacimiento));
} 

Al ejecutar nuestra aplicación y escribir una fecha válida (que sea igual o anterior a la fecha actual), nos mostrará el signo zodiacal relacionado con la fecha especificada tal y como lo muestra la siguiente figura:

Comments

MVPs en Latinoamerica said:

Miguel Angel Moran nos comparte este excelente recurso, donde podr&#225;n encontrar: Introducci&#243;n

# February 13, 2008 10:10 AM

Noticias externas said:

Miguel Angel Moran nos comparte este excelente recurso, donde podrán encontrar: Introducción a Workflow

# February 13, 2008 11:10 AM

Mario Ortiz said:

Excelente ejemplo. Sencillo pero muy didáctico,

Se expone todo el poder y el potencial de trabajo de los WorkFlow.

Gracias por compartirlo con nosotros.

Atte: Mario Ortiz

# April 14, 2008 10:08 AM

Eudorax said:

Que tal Miguel Angel, checando este valioso ejemplo que aqui nos posteas y probando encontre este error, o mas bien quiza me haya faltado alguna referencia, me manda error en LOCALHOST, el error es el siguiente:

mucho te agradeceria me ayudaras, pleaseeeeeeeeeeee.

Error 1 The type or namespace name 'localhost' could not be found (are you missing a using directive or an assembly reference?)

static void Main(string[] args)

       {

           Console.WriteLine("Escriba su fecha de nacimiento: ");

           DateTime fechaNacimiento = Convert.ToDateTime(Console.ReadLine());

           localhost.Workflow1_WebService ws = new AplicacionCliente.localhost.Workflow1_WebService();

           Console.WriteLine(ws.RegresaSignoZodiacal(fechaNacimiento));

           Console.ReadLine();

       }

# August 5, 2008 2:21 PM
Leave a Comment

(required) 

(required) 

(optional)

(required) 


Protected by FormShield
Refresh
Listen
Please enter the characters shown on the image


Code: