Condividi tramite


Servizi durevoli

In questo esempio viene illustrato come creare un servizio durevole implementando una calcolatrice come servizio durevole. Poiché il servizio viene reso durevole dopo ogni chiamata, lo stato del servizio viene salvato. Se il servizio viene riciclato, lo stato può essere ripristinato al punto di persistenza più recente ed è pertanto necessario un servizio di persistenza.

Nota

Per poter essere generato ed eseguito, l'esempio richiede che sia installato .NET Framework versione 3.5. Per aprire il progetto e i file della soluzione è necessario Visual Studio 2008.

Per ulteriori informazioni sulla configurazione di questo esempio, vedere Procedura di installazione singola per gli esempi di Windows Communication Foundation. È necessario eseguire il client calcolatrice con questo servizio. Per ulteriori informazioni, vedere le procedure di impostazione alla fine di questo argomento.

Nell'esempio di codice seguente viene illustrato un contratto di servizio per il servizio calcolatrice.

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

Nel codice seguente, l'attributo DurableServiceAttribute viene utilizzato nell'implementazione del servizio per specificare che si tratta di un servizio durevole.

[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()
    {
    }

}

L'attributo DurableOperationAttribute specifica che lo stato dell'istanza viene salvato al completamento dell'operazione.

Possono essere specificati due campi sull'attributo DurableOperationAttribute.

La proprietà CanCreateInstance specifica che l'istanza viene creata quando viene richiamata l'operazione. Affinché CanCreateInsatance funzioni correttamente, l'operazione su cui viene specificato deve essere un'operazione di richiesta/risposta. In questo esempio, il contesto viene propagato al client e la durabilità si ottiene tramite la capacità del client di comunicare con il servizio. Se l'operazione è unidirezionale, il contesto non viene propagato al client; pertanto deve essere utilizzata un'altra modalità per passare il contesto al client se deve essere condotta una conversazione di lunga durata e durevole con l'istanza del servizio.

La proprietà CompletesInstance specifica che l'istanza viene completata dopo il completamento dell'operazione sulla quale è specificata. Al completamento dell'operazione lo stato viene eliminato anche dal database.

Nel codice seguente viene illustrato il file con estensione svc destinato a ospitare questo esempio in Internet Information Services (IIS).

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

Le associazioni del servizio sono configurate nel file Web.config. Vengono esposti due endpoint con associazioni diverse: un oggetto BasicHttpContextBinding con cookie abilitati e WSHttpContextBinding per i client che non desiderano utilizzare BasicHttpContextBinding. L'associazione WSHttpContextBinding consente di mantenere il contesto utilizzato per indirizzare le richieste a una particolare istanza del servizio durevole. La voce PersistenceProvider che specifica il provider di persistenza è situata nella sezione ServiceBehaviors.

Per impostare ed eseguire il servizio

  1. Per impostare correttamente questo esempio utilizzando script, vedere Procedura di installazione singola per gli esempi di Windows Communication Foundation.

  2. In IIS, attivare l'autenticazione di Windows sulla directory virtuale ServiceModelSamples.

    Per attivare l'autenticazione di Windows in IIS 5.1 o 6.0:

    1. Aprire una finestra del prompt dei comandi e digitare start inetmgr per aprire lo snap-in MMC di Gestione Internet Information Services (IIS).
    2. Fare clic con il pulsante destro del mouse sulla radice virtuale ServiceModelSamples all'interno di Sito Web predefinito, scegliere Proprietà e quindi la scheda Protezione directory.
    3. In Controllo autenticazione e accesso, scegliere Modifica.
    4. Nella finestra di dialogo Metodi di autenticazione selezionare Autenticazione integrata di Windows.

    Per attivare l'autenticazione di Windows in IIS 7.0:

    1. Aprire una finestra del prompt dei comandi e digitare start inetmgr per aprire lo snap-in MMC di Gestione Internet Information Services (IIS).
    2. Selezionare la radice virtuale ServiceModelSamples all'interno di Sito Web predefinito.
    3. Nel riquadro iniziale ServiceModelSamples, fare doppio clic su Autenticazione nel gruppo IIS.
    4. Selezionare Autenticazione di Windows e selezionare l'azione Attiva.
  3. Compilare il progetto. Il progetto compila e aggiorna ServiceModelSamples.

  4. Per consentire l'accesso all'archivio durevole:

    1. Eseguire lo script CreateStores.cmd situato nell'argomento Procedura di installazione singola per gli esempi di Windows Communication Foundation. In questo esempio viene utilizzato il database NetFx35Samples_DurableServiceStore.
    2. Impostare l'account utente ASP.NET come membro del gruppo di utenti SQL Server.
  5. Per assicurarsi che il servizio sia installato correttamente, fare riferimento all'indirizzo https://localhost/ServiceModelSamples/service.svc. Dovrebbe essere visualizzata la pagina della Guida del servizio. Per visualizzare il linguaggio di descrizione dei servizi Web (WSDL, Web Services Descriptor Language), digitare https://localhost/ServiceModelSamples/service.svc?wsdl.

  6. Per eseguire l'esempio è necessario utilizzare l'Esempio client calcolatrice. Si tratta di un'interfaccia utente calcolatrice creata utilizzando Windows Presentation Foundation (WPF) che funge da client per il servizio. È possibile utilizzare endpoint diversi che corrispondono alle associazioni fornite dal servizio. Per modificare le associazioni, fare clic sulla voce di menu Endpoint e selezionare l'associazione appropriata, BasicHttpContextBinding o WSHttpContextBinding.

  7. Per testare la natura durevole del servizio, chiudere il client e riaprirlo mentre il client calcolatrice è in esecuzione. Il client calcolatrice comunica di ritorno con la stessa istanza del servizio e visualizza l'ID dell'istanza nella parte inferiore. Il client calcolatrice utilizza un file di testo denominato Client.ctx per archiviare il contesto in una posizione durevole la prima volta che viene eseguita una chiamata (in questo caso, nella directory \bin dell'esempio). Quando viene riavviato, il client controlla se il file è presente. Se il file è presente, applica il contesto archiviato al canale che viene creato. Se il servizio durevole è stato completato e viene aperto il client con il file Client.ctx ancora nella directory \bin, il servizio tenterà di applicare il contesto al canale. Verrà generato un errore, poiché l'istanza del servizio durevole con cui si desidera comunicare non è presente. Eliminare il file e provare nuovamente.

  8. È inoltre possibile riciclare il servizio durevole riavviando IIS. Poiché dopo ogni operazione viene utilizzato un archivio di persistenza, lo stato del servizio viene archiviato. Pertanto, quando si tenta di comunicare con il servizio dal client dopo il riavvio di IIS, l'infrastruttura riceve l'istanza del servizio durevole dall'archivio di persistenza e sarà possibile comunicare con la stessa istanza.

    Nota

    Quando si richiama un'operazione per la prima volta dopo il riavvio di IIS, si riceve un'eccezione MessageSecurityException causata da un token di protezione scaduto sul canale. Richiamare un'altra operazione e l'operazione riuscirà.

Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.