Modelli di progettazione: pubblicazione-sottoscrizione basata su elenchi

Questo esempio illustra il modello pubblicazione-sottoscrizione basata su elenchi implementato come programma Windows Communication Foundation (WCF).

Nota

La procedura di installazione e le istruzioni di compilazione per questo esempio si trovano alla fine di questo argomento.

Il modello di progettazione per pubblicazione-sottoscrizione basata su elenchi è descritto nella pubblicazione di Microsoft Patterns & Practices, Integration Patterns (informazioni in lingua inglese). Il modello pubblicazione-sottoscrizione passa informazioni a un insieme di destinatari che hanno sottoscritto un argomento di informazioni. La pubblicazione-sottoscrizione basata su elenchi gestisce un elenco di sottoscrittori. Quando sono disponibili informazioni da condividere, viene inviata una copia a ciascun sottoscrittore nell'elenco. Questo esempio dimostra un modello dinamico di pubblicazione-sottoscrizione basata su elenchi, nel quale i client possono sottoscrivere o annullare la sottoscrizione in qualsiasi momento.

L'esempio di pubblicazione-sottoscrizione basata su elenchi è costituito da un client, un servizio e un programma dell'origine dati. È possibile avere più di un client e di un programma di origine dati in esecuzione. I client sottoscrivono il servizio, ricevono le notifiche e annullano la sottoscrizione. I programmi di origine dati inviano informazioni al servizio da condividere con tutti i sottoscrittori correnti.

In questo esempio, il client e l'origine dati sono programmi console (file con estensione exe) e il servizio è una libreria (file con estensione dll) ospitata in Internet Information Services (IIS). Le attività di client e origine dati sono visibili sul desktop.

Il servizio utilizza la comunicazione duplex. Il contratto di servizio ISampleContract è abbinato a un contratto di callback ISampleClientCallback. Il servizio implementa operazioni del servizio di sottoscrizione e annullamento della sottoscrizione che vengono utilizzate dai client per aderire o uscire dall'elenco dei sottoscrittori. Il servizio implementa anche l'operazione del servizio PublishPriceChange che viene chiamata dal programma di origine dati per fornire le nuove informazioni al servizio. Il programma client implementa l'operazione del servizio PriceChange che viene chiamata dal servizio per notificare a tutti i sottoscrittori una variazione di prezzo.

// Create a service contract and define the service operations.
// NOTE: The service operations must be declared explicitly.
[ServiceContract(SessionMode=SessionMode.Required,
      CallbackContract=typeof(ISampleClientContract))]
public interface ISampleContract
{
    [OperationContract(IsOneWay = false, IsInitiating=true)]
    void Subscribe();
    [OperationContract(IsOneWay = false, IsTerminating=true)]
    void Unsubscribe();
    [OperationContract(IsOneWay = true)]
    void PublishPriceChange(string item, double price, 
                                     double change);
}

public interface ISampleClientContract
{
    [OperationContract(IsOneWay = true)]
    void PriceChange(string item, double price, double change);
}

Il servizio utilizza un evento .NET Framework come meccanismo per segnalare a tutti i sottoscrittori le nuove informazioni. Quando un client aderisce al servizio chiamando Subscribe, fornisce un gestore eventi. Quando un client lascia, annulla la sottoscrizione del gestore eventi dall'evento. Quando un'origine dati chiama il servizio per segnalare una variazione di prezzo, il servizio genera l'evento. Questo chiama ciascuna istanza del servizio, una per ogni client che ha sottoscritto e determina l'esecuzione dei relativi gestori eventi. Ogni gestore eventi passa le informazioni al relativo client tramite la propria funzione di callback.

public class PriceChangeEventArgs : EventArgs
    {
        public string Item;
        public double Price;
        public double Change;
    }

    // The Service implementation implements your service contract.
    [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
    public class SampleService : ISampleContract
    {
        public static event PriceChangeEventHandler PriceChangeEvent;
        public delegate void PriceChangeEventHandler(object sender, PriceChangeEventArgs e);

        ISampleClientContract callback = null;

        PriceChangeEventHandler priceChangeHandler = null;

        //Clients call this service operation to subscribe.
        //A price change event handler is registered for this client instance.

        public void Subscribe()
        {
            callback = OperationContext.Current.GetCallbackChannel<ISampleClientContract>();
            priceChangeHandler = new PriceChangeEventHandler(PriceChangeHandler);
            PriceChangeEvent += priceChangeHandler;
        }

        //Clients call this service operation to unsubscribe.
        //The previous price change event handler is deregistered.

        public void Unsubscribe()
        {
            PriceChangeEvent -= priceChangeHandler;
        }

        //Information source clients call this service operation to report a price change.
        //A price change event is raised. The price change event handlers for each subscriber will execute.

        public void PublishPriceChange(string item, double price, double change)
        {
            PriceChangeEventArgs e = new PriceChangeEventArgs();
            e.Item = item;
            e.Price = price;
            e.Change = change;
            PriceChangeEvent(this, e);
        }

        //This event handler runs when a PriceChange event is raised.
        //The client's PriceChange service operation is invoked to provide notification about the price change.

        public void PriceChangeHandler(object sender, PriceChangeEventArgs e)
        {
            callback.PriceChange(e.Item, e.Price, e.Change);
        }

    }

Quando si esegue l'esempio, avviare alcuni client. I client sottoscrivono il servizio. Quindi eseguire il programma di origine dati che invia le informazioni al servizio. Il servizio passa le informazioni a tutti i sottoscrittori. Le attività rilevate in ciascuna console client confermano che le informazioni sono state ricevute. Premere INVIO nella finestra del client per arrestare il client.

Per impostare e compilare l'esempio

  1. Assicurarsi di avere eseguito Procedura di installazione singola per gli esempi di Windows Communication Foundation.

  2. Per compilare l'edizione in C# o Visual Basic .NET della soluzione, seguire le istruzioni in Generazione degli esempi Windows Communication Foundation.

Per eseguire l'esempio sullo stesso computer

  1. Test that you can access the service using a browser by entering the following address: https://localhost/servicemodelsamples/service.svc. In risposta, viene visualizzata un pagina di conferma.

  2. Eseguire Client.exe da \client\bin\, nella cartella specifica del linguaggio. L'attività del client viene visualizzata nella finestra della console client. Avviare alcuni client.

  3. Eseguire Datasource.exe da \datasource\bin\, nella cartella specifica del linguaggio. L'attività dell'origine dati viene visualizzata nella finestra della console. Quando l'origine dati invia informazioni al servizio, questo dovrebbe passarle a ciascun client.

  4. Se i programmi client, origine dati e servizio non sono in grado di comunicare, vedere Suggerimenti per la risoluzione dei problemi.

Per eseguire l'esempio tra più computer

  1. Impostare il computer del servizio:

    1. Sul computer del servizio, creare una directory virtuale denominata ServiceModelSamples. Il file batch Setupvroot.bat incluso in Procedura di installazione singola per gli esempi di Windows Communication Foundation può essere utilizzato per creare la directory del disco e quella virtuale.
    2. Copiare i file del programma del servizio da %SystemDrive%\Inetpub\wwwroot\servicemodelsamples alla directory virtuale di ServiceModelSamples sul computer del servizio. Assicurarsi di includere i file nella directory \bin.
    3. Verificare che sia possibile accedere al servizio dal computer client utilizzando un browser.
  2. Impostare i computer client:

    1. Copiare i file del programma client dalla cartella \client\bin\, nella cartella specifica del linguaggio, ai computer client.
    2. In ciascun file di configurazione client, modificare il valore dell'indirizzo di definizione dell'endpoint in modo che corrisponda al nuovo indirizzo del servizio. Sostituire qualsiasi riferimento a "localhost" con un nome di dominio completo nell'indirizzo.
  3. Impostare il computer dell'origine dati:

    1. Copiare i file di programma dell'origine dati dalla cartella \datasource\bin\, nella cartella specifica del linguaggio, al computer dell'origine dati.
    2. Nel file di configurazione dell'origine dati, modificare il valore dell'indirizzo della definizione dell'endpoint affinché corrisponda al nuovo indirizzo del servizio. Sostituire qualsiasi riferimento a "localhost" con un nome di dominio completo nell'indirizzo.
  4. Sui computer client, avviare Client.exe da un prompt dei comandi.

  5. Sul computer dell'origine dati, avviare Datasource.exe da un prompt dei comandi.

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