Compartir a través de


Ejemplo de proveedor de persistencia de archivo

Download sample

Este ejemplo muestra cómo crear un proveedor de persistencia que funciona con servicios duraderos. El proveedor de persistencia es una característica de extensibilidad de servicios del flujo de trabajo y este ejemplo muestra cómo crear un servicio de persistencia. El estado de la instancia del servicio está almacenado en archivos en su equipo.

El ejemplo también contiene una implementación de servicio de calculadora, que es igual que Ejemplo de servicio duradero. La diferencia es que este servicio utiliza el proveedor de persistencia de archivo creado en el ejemplo en lugar de utilizar proveedor de persistencia de bloqueo estándar de SQL.

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.

Ejemplo de cliente calculadora se debe ejecutar con este servicio (Para obtener más información, vea , los procedimientos de configuración al final de este tema).

Proveedor de persistencia de archivo

El proveedor de persistencia de archivo en este ejemplo se define en el archivo FilePersistenceProviderFactory.cs. Observe que la clase realFilePersistenceProvider se encuentra en una clase incrustada. Para crear el proveedor de persistencia de archivo, se utiliza un modelo de generador en el que el generador pasa la clase real del proveedor de persistencia al tiempo de ejecución del servicio cuando se requiere. Ésta es la manera estándar de crear los proveedores en WCF.

La clase del generador del proveedor de persistencia de archivo hereda de la clase abstracta PersistenceProviderFactory. La clase abstracta PersistenceProviderFactory se define en el código siguiente.

namespace System.ServiceModel.Persistence
{
    public abstract class PersistenceProviderFactory : CommunicationObject
    {
        protected PersistenceProviderFactory();

        public abstract PersistenceProvider CreateProvider(Guid id);
    }
}

Observe que PersistenceProviderFactory hereda de la clase abstracta CommunicationObject. CommunicationObject proporciona los métodos exigidos para administrar la duración del objeto a lo largo de su uso en el servicio en tiempo de ejecución.

El modelo del generador para el proveedor ayuda a asegurarse de que el generador administra cualquier recurso que sea común a todas las instancias del proveedor. Por ejemplo, en el caso del proveedor de persistencia de archivo, el generador puede determinar la ubicación en la que los archivos de persistencia están almacenados y, a continuación, se comparten entre todas las instancias del proveedor de persistencia de archivo real.

Como resultado existe una instancia del proveedor para cada instancia del servicio. Existe también una instancia del generador para cada host.

El propio proveedor de persistencia de archivo hereda de la clase abstracta PersistenceProvider. Esta clase se define en el código siguiente.

namespace System.ServiceModel.Persistence
{
    public abstract class PersistenceProvider : CommunicationObject
    {
        protected PersistenceProvider(Guid id);

        public Guid Id { get; }

        public abstract IAsyncResult BeginCreate(object instance, TimeSpan timeout, AsyncCallback callback, object state);
        public abstract IAsyncResult BeginDelete(object instance, TimeSpan timeout, AsyncCallback callback, object state);
        public abstract IAsyncResult BeginLoad(TimeSpan timeout, AsyncCallback callback, object state);
        public virtual IAsyncResult BeginLoadIfChanged(TimeSpan timeout, object instanceToken, AsyncCallback callback, object state);
        public abstract IAsyncResult BeginUpdate(object instance, TimeSpan timeout, AsyncCallback callback, object state);
        public abstract object Create(object instance, TimeSpan timeout);
        public abstract void Delete(object instance, TimeSpan timeout);
        public abstract object EndCreate(IAsyncResult result);
        public abstract void EndDelete(IAsyncResult result);
        public abstract object EndLoad(IAsyncResult result);
        public virtual bool EndLoadIfChanged(IAsyncResult result, out object instance);
        public abstract object EndUpdate(IAsyncResult result);
        public abstract object Load(TimeSpan timeout);
        public virtual bool LoadIfChanged(TimeSpan timeout, object instanceToken, out object instance);
        public abstract object Update(object instance, TimeSpan timeout);    
    }
}

La clase del proveedor de persistencia también es un objeto de comunicación. Hay 4 métodos en el proveedor de persistencia: Create(), Update(), Load()y Delete(). Se definen los tipos variantes asincrónicos de estos métodos así como las sobrecargas de los tipos variantes asincrónicos. Las reglas siguientes se aplican al almacenado del estado de la instancia en los archivos:

  • Los archivos reales están almacenados en un directorio denominado FilePersistenceProvider en el directorio Temp en el equipo en el que se hospeda el servicio.

  • El estado de una instancia está almacenado en un archivo, cuyo nombre es el único identificador de la instancia. Este archivo está almacenado con una extensión .bin.

  • Cuando se debe eliminar un archivo, no se elimina realmente, sino que se cambia el nombre en su lugar como "eliminado."

Configuración del proveedor de persistencia

Antes de utilizarlo, el proveedor de persistencia de archivo se debe especificar en el archivo de configuración para el servicio. La configuración del proveedor de persistencia se especifica en la sección service behaviors del archivo de configuración. Este ejemplo muestra la entrada en el archivo Web.config.

<behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior"  >
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <serviceCredentials>
            <windowsAuthentication allowAnonymousLogons="false" includeWindowsGroups="true" />
          </serviceCredentials>
          <persistenceProvider type="Microsoft.WorkflowServices.Samples.FilePersistenceProviderFactory, DurableServiceFactory, Version=1.0.0.0"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>  

Código de servicio duradero – Contrato de servicio

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();
    }  

Implementación del servicio

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

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

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

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

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

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

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

    [DurableOperation(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.

Hay 2 parámetros que se pueden utilizar en el atributo DurableOperationAttribute. La propiedad CanCreateInstance especifica que se crea la instancia cuando se invoca esa operación. La propiedad CompletesInstance especifica que la instancia del servicio se completa una vez la operación en la que se especifica este atributo haya terminado de ejecutarse. 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" %>

El enlace para el servicio se configura en el archivo Web.config. 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 del proveedor de persistencia que especifica el proveedor de persistencia se encuentra en la secciónServiceBehaviors.

Para configurar, generar y ejecutar el ejemplo

  1. Asegúrese de que lleva a cabo las instrucciones de configuración en 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 los Servicios de Internet Information Server (IIS).

    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 los Servicios de Internet Information Server (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 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.

  5. 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. 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 es así, éste aplica el contexto almacenado al canal que se crea. Si el servicio del flujo de trabajo ha finalizado y usted 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.

  6. 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 del 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 usted 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 será correcta.

Footer image

Copyright © 2007 Microsoft Corporation. Reservados todos los derechos.