Ejemplo de servicio duradero

Download sample

Este ejemplo muestra cómo crear un servicio duradero implementando una calculadora como un servicio de este tipo. Dado que el servicio es duradero después de cada llamada, se guarda el estado del servicio. Si el servicio se recicla, se puede restaurar el estado al punto de persistencia más reciente y así se necesita un servicio de persistencia.

Nota

Para generar y ejecutar este ejemplo, es necesario que esté instalado .NET Framework versión 3.5. Para abrir los archivos de solución y proyecto se necesita Visual Studio 2008.

Para obtener más información acerca de que prepara este ejemplo, consulte Procedimiento de instalación único para ejemplos de Windows Communication Foundation. Debe ejecutar el cliente de la calculadora con este servicio. Para obtener más información, vea los procedimientos de configuración al final de este tema.

El ejemplo de código siguiente muestra el contrato de servicio para el servicio de calculadora.

[ServiceContract(Namespace = "http://Microsoft.WorkflowServices.Samples")]
    public interface ICalculator
    {
        [OperationContract()]
        int PowerOn();
        [OperationContract()]
        int Add(int value);
        [OperationContract()]
        int Subtract(int value);
        [OperationContract()]
        int Multiply(int value);
        [OperationContract()]
        int Divide(int value);
        [OperationContract()]
        void PowerOff();
    }  

En el código siguiente, el atributo DurableServiceAttribute se utiliza en la implementación del servicio para especificar que es un servicio duradero.

[Serializable]
[DurableServiceBehavior]
public class DurableCalculator : ICalculator
{
    int currentValue = default(int);

    [DurableOperationBehavior(CanCreateInstance=true)]
    public int PowerOn()
    {
        return currentValue;
    }

    [DurableOperationBehavior()]
    public int Add(int value)
    {
        return (currentValue += value);
    }

    [DurableOperationBehavior()]
    public int Subtract(int value)
    {
        return (currentValue -= value);
    }

    [DurableOperationBehavior()]
    public int Multiply(int value)
    {
        return (currentValue *= value);
    }

    [DurableOperationBehavior()]
    public int Divide(int value)
    {
        return (currentValue /= value);
    }

    [DurableOperationBehavior(CompletesInstance=true)]
    public void PowerOff()
    {
    }

}

El atributo DurableOperationAttribute especifica que se guarda el estado de la instancia después de que la operación haya finalizado.

Se pueden especificar dos campos en el atributo DurableOperationAttribute.

La propiedad CanCreateInstance especifica que se crea la instancia cuando se invoca esa operación. Para que CanCreateInsatance funcione correctamente, la operación en la que se especifica debe ser una operación de solicitud/respuesta. En este ejemplo, el contexto se propaga al cliente y se consigue la durabilidad mediante la capacidad del cliente para comunicarse con el servicio. Si la operación es unidireccional, el contexto no se propaga al cliente; por consiguiente, debe haber otra manera de pasar el contexto al cliente si se va a realizar una conversación de ejecución prolongada y duradera con la instancia del servicio.

La propiedad CompletesInstance especifica que la instancia se completa después de que la operación en la que se especifica haya finalizado. El estado también se elimina de la base de datos después de que la operación haya finalizado.

El código siguiente muestra el archivo .svc para hospedar este ejemplo en Internet Information Services (IIS).

<%@ServiceHost language=c# Debug="true" Service="Microsoft.WorkflowServices.Samples.DurableCalculator" Factory="System.ServiceModel.Activation.ServiceHostFactory" %>

Los enlaces para el servicio se configuran en el archivo Web.config. Se exponen dos extremos con enlaces diferentes: BasicHttpContextBinding con cookies habilitadas y WSHttpContextBinding para los clientes que no desean utilizar BasicHttpContextBinding. El enlace WSHttpContextBinding ayuda a mantener el contexto que se utiliza para enrutar las solicitudes a una instancia de flujo de trabajo determinada. La entrada PersistenceProvider que especifica el proveedor de persistencia se encuentra en la sección ServiceBehaviors.

Para configurar y ejecutar el servicio

  1. Para configurar correctamente este ejemplo mediante scripts, consulte Procedimiento de instalación único para ejemplos de Windows Communication Foundation.

  2. En IIS, habilite la autenticación de Windows en el directorio virtual de ServiceModelSamples.

    Para habilitar la autenticación de Windows en IIS 5.1 o 6.0:

    1. Abra una ventana del símbolo del sistema y escriba start inetmgr para abrir el complemento MMC de Internet Information Services.

    2. Haga clic con el botón secundario en ServiceModelSamples de la raíz virtual dentro de Sitio Web predeterminado, haga clic en Propiedades y, a continuación, haga clic en la ficha Seguridad de directorios.

    3. En Autenticación y control de acceso haga clic en Editar.

    4. En el cuadro de diálogo Métodos de autenticación, seleccione Autenticación de Windows integrada.

    Para habilitar la autenticación de Windows en IIS 7.0:

    1. Abra una ventana del símbolo del sistema y escriba start inetmgr para abrir el complemento MMC de Internet Information Services (IIS).

    2. Seleccione la raíz virtual de ServiceModelSamples dentro de Sitio Web predeterminado.

    3. Dentro del panel de inicio de ServiceModelSamples, haga doble clic en Autenticación dentro del grupo IIS.

    4. Seleccione Autenticación de Windows y seleccione la acción Habilitar.

  3. Genere el proyecto. El proyecto genera y actualiza ServiceModelSamples.

  4. Para permitir el acceso al almacén duradero:

    1. Ejecute el script CreateStores.cmd situado en el tema Procedimiento de instalación único para ejemplos de Windows Communication Foundation. Este ejemplo utiliza la base de datos NetFx35Samples_DurableServiceStore.

    2. Convierta la cuenta de usuario de ASP.NET en un miembro del grupo de usuarios de SQL Server.

  5. Para asegurarse de que el servicio se ha instalado correctamente, señale la dirección https://localhost/ServiceModelSamples/service.svc. Debería ver la página de ayuda del servicio. Para consultar el Lenguaje de descripción de servicios web (WSDL), escriba https://localhost/ServiceModelSamples/service.svc? wsdl.

  6. Para ejecutar este ejemplo, debe utilizar Ejemplo de cliente calculadora. Es una interfaz de usuario de la calculadora creada mediante , que actúa como un cliente para el servicio. Puede utilizar extremos diferentes que se corresponden con los enlaces que el servicio proporciona. Para cambiar los enlaces, haga clic en el elemento de menú Extremo y seleccione el enlace adecuado, BasicHttpContextBinding o WSHttpContextBinding.

  7. Para probar la naturaleza duradera del servicio, cierre el cliente y vuélvalo a abrir mientras el cliente de la calculadora se está ejecutando. El cliente de la calculadora se comunica de nuevo con la misma instancia del servicio y muestra el id. de la instancia en la parte inferior. El cliente de la calculadora utiliza un archivo de texto llamado Client.ctx para almacenar el contexto en un lugar duradero la primera vez que se realiza una llamada (en este caso, en el directorio \bin de su ejemplo). Al volver a abrir el cliente, compruebe si el archivo está presente. Si lo está, aplica el contexto almacenado al canal que se crea. Si el servicio del flujo de trabajo ha finalizado y abre el cliente con el archivo Client.ctx aún en su directorio \bin, éste intenta aplicar el contexto al canal. Recibe un error porque la instancia de flujo de trabajo con la que desea comunicarse no está allí. Elimine el archivo y vuelva a intentarlo.

  8. También puede reciclar el servicio del flujo de trabajo reiniciando IIS. Dado que está utilizando un almacén de persistencia después de cada operación, se almacena el estado del servicio. Por consiguiente, al intentar comunicarse con el servicio desde el cliente después de que se haya reiniciado IIS, la infraestructura del flujo de trabajo recibe la instancia de flujo de trabajo desde el almacén de persistencia y puede comunicarse con la misma instancia.

    Nota

    Al invocar por primera vez una operación después de reiniciar IIS, recibe una excepción MessageSecurityException, que se produce por un token de seguridad caducado en el canal. Invoque otra operación y se realizará correctamente.

Footer image

Copyright © 2007 Microsoft Corporation. Reservados todos los derechos.