Entwurfsmuster: Listenbasiertes Veröffentlichen-AbonnierenDesign Patterns: List-Based Publish-Subscribe

In diesem Beispiel wird veranschaulicht, die als Windows Communication Foundation (WCF) Programm implementierte listenbasierte Veröffentlichen-Abonnieren-Muster.This sample illustrates the List-based Publish-Subscribe pattern implemented as a Windows Communication Foundation (WCF) program.

Hinweis

Die Setupprozedur und die Buildanweisungen für dieses Beispiel befinden sich am Ende dieses Themas.The setup procedure and build instructions for this sample are located at the end of this topic.

Das listenbasierte Veröffentlichen-Abonnieren-Entwurfsmuster wird in der Publikation "Microsoft Patterns & Practices" unter beschriebenen Integrationsmuster.The List-based Publish-Subscribe design pattern is described in the Microsoft Patterns & Practices publication, Integration Patterns. Das Veröffentlichen-Abonnieren-Muster übergibt Informationen an eine Auflistung von Empfängern, die ein Informationsthema abonniert haben.The Publish-Subscribe pattern passes information to a collection of recipients who have subscribed to an information topic. Listenbasiertes Veröffentlichen-Abonnieren verwaltet eine Liste von Abonnenten.List-based publish-subscribe maintains a list of subscribers. Wenn für die Veröffentlichung bestimmte Informationen vorhanden sind, wird jedem Abonnenten auf der Liste ein Exemplar geschickt.When there is information to share, a copy is sent to each subscriber on the list. Dieses Beispiel veranschaulicht ein dynamisches listenbasiertes Veröffentlichen-Abonnieren-Muster, das von Kunden nach Bedarf abonniert und abbestellt werden kann.This sample demonstrates a dynamic list-based publish-subscribe pattern, where clients can subscribe or unsubscribe as often as required.

Das Beispiel für listenbasiertes Veröffentlichen-Abonnieren besteht aus einem Client, einem Dienst und einem Datenquellenprogramm.The List-based Publish-Subscribe sample consists of a client, a service, and a data source program. Es können mehrere Clients und mehrere Datenquellenprogramme ausgeführt werden.There can be more than one client and more than one data source program running. Clients abonnieren den Dienst, empfangen Benachrichtigungen und bestellen den Dienst ab.Clients subscribe to the service, receive notifications, and unsubscribe. Datenquellprogramme senden Informationen an den Dienst, die für alle aktuellen Abonnenten veröffentlicht werden sollte.Data source programs send information to the service to be shared with all current subscribers.

In diesem Beispiel sind der Client und die Datenquelle Konsolenprogramme (.exe-Dateien), und der Dienst ist eine Bibliothek (.dll), die in Internet Information Services (IIS) gehostet wird.In this sample, the client and data source are console programs (.exe files) and the service is a library (.dll) hosted in Internet Information Services (IIS). Client- und Datenquellenaktivität sind auf dem Desktop sichtbar.Client and data source activity are visible on the desktop.

Der Dienst verwendet Duplexkommunikation.The service uses duplex communication. Der ISampleContract-Dienstvertrag wird mit einem ISampleClientCallback-Rückrufvertrag zusammengefasst.The ISampleContract service contract is paired up with an ISampleClientCallback callback contract. Der Dienst implementiert Subscribe- und Unsubscribe-Dienstvorgänge, die von Clients verwendet werden, um der Liste der Abonnenten beizutreten oder diese zu verlassen.The service implements Subscribe and Unsubscribe service operations, which clients use to join or leave the list of subscribers. Der Dienst implementiert außerdem den PublishPriceChange-Dienstvorgang, der vom Datenquellenprogramm aufgerufen wird, um dem Dienst neue Informationen bereitzustellen.The service also implements the PublishPriceChange service operation, which the data source program calls to provide the service with new information. Das Clientprogramm implementiert den PriceChange-Dienstvorgang, der vom Dienst aufgerufen wird, um alle Abonnenten über Preisänderungen zu informieren.The client program implements the PriceChange service operation, which the service calls to notify all subscribers of a price change.

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

Der Dienst verwendet ein .NET Framework-Ereignis als Mechanismus, um alle Abonnenten über neue Informationen zu informieren.The service uses a .NET Framework event as the mechanism to inform all subscribers about new information. Wenn ein Client dem Dienst beitritt, indem er Subscribe aufruft, wird ein Ereignishandler bereitgestellt.When a client joins the service by calling Subscribe, it provides an event handler. Wenn ein Client den Dienst verlässt, wird sein Ereignishandler von dem Ereignis entfernt.When a client leaves, it unsubscribes its event handler from the event. Wenn eine Datenquelle den Dienst aufruft, um eine Preisänderung mitzuteilen, löst der Dienst das Ereignis aus.When a data source calls the service to report a price change, the service raises the event. Daraufhin wird jede Instanz des Diensts aufgerufen, eine für jeden Client mit einem Abonnement, und die Ereignishandler werden ausgeführt.This calls each instance of the service, one for each client that has subscribed, and causes their event handlers to execute. Jeder Ereignishandler übermittelt die Informationen über seine Rückruffunktion an seinen Client.Each event handler passes the information to its client through its callback function.

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 unregistered.  

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

    }  

Wenn Sie das Beispiel ausführen, starten Sie mehrere Clients.When you run the sample, launch several clients. Die Clients abonnieren den Dienst.The clients subscribe to the service. Führen Sie anschließend das Datenquellenprogramm aus, das Informationen an den Dienst sendet.Then run the data source program, which sends information to the service. Der Dienst übergibt die Informationen an alle Abonnenten.The service passes on the information to all subscribers. Sie können Aktivität auf jeder Clientkonsole sehen, sodass bestätigt wird, dass die Informationen empfangen wurden.You can see activity on each client console confirming that the information has been received. Drücken Sie im Clientfenster die EINGABETASTE, um den Client zu schließen.Press ENTER in the client window to shut down the client.

So richten Sie das Beispiel ein und erstellen esTo set up and build the sample

  1. Stellen Sie sicher, dass Sie ausgeführt haben die Setupprozedur für die Windows Communication Foundation-Beispiele zum einmaligen.Ensure that you have performed the One-Time Setup Procedure for the Windows Communication Foundation Samples.

  2. Um die C#- oder Visual Basic .NET-Edition der Projektmappe zu erstellen, befolgen Sie die unter Building the Windows Communication Foundation Samplesaufgeführten Anweisungen.To build the C# or Visual Basic .NET edition of the solution, follow the instructions in Building the Windows Communication Foundation Samples.

So führen Sie das Beispiel auf demselben Computer ausTo run the sample on the same machine

  1. Testen Sie, ob Sie den Dienst mithilfe eines Browsers durch Eingabe der folgenden Adresse zugreifen können: http://localhost/servicemodelsamples/service.svc.Test that you can access the service using a browser by entering the following address: http://localhost/servicemodelsamples/service.svc. Als Antwort sollte eine Bestätigungsseite angezeigt werden.A confirmation page should be displayed in response.

  2. Führen Sie Client.exe aus \client\bin\, unter dem sprachspezifischen Ordner.Run Client.exe from \client\bin\, from under the language-specific folder. Im Clientkonsolenfenster wird die Clientaktivität angezeigt.Client activity is displayed on the client console window. Starten Sie mehrere Clients.Launch several clients.

  3. Führen Sie Datasource.exe von \datasource\bin\, unter dem sprachspezifischen Ordner.Run Datasource.exe from \datasource\bin\, from under the language-specific folder. Die Datenquellenaktivität wird im Konsolenfenster angezeigt.Data source activity is displayed on the console window. Sobald die Datenquelle Informationen an den Dienst sendet, sollten diese an jeden Client übergeben werden.Once the data source sends information to the service, it should be passed on to each client.

  4. Wenn der Client, Datenquelle und Dienstprogramme nicht miteinander kommunizieren können, finden Sie unter Tipps zur Problembehandlung.If the client, data source, and service programs are not able to communicate, see Troubleshooting Tips.

So führen Sie das Beispiel computerübergreifend ausTo run the sample across machines

  1. Einrichten des Dienstrechners:Set up the service machine:

    1. Erstellen Sie auf dem Dienstcomputer ein virtuelles Verzeichnis namens "ServiceModelSamples".On the service machine, create a virtual directory named ServiceModelSamples. Die Batchdatei Setupvroot.bat aus der Setupprozedur für die Windows Communication Foundation-Beispiele zum einmaligen zum Erstellen des festplattenverzeichnisses und des virtuellen Verzeichnisses verwendet werden können.The batch file Setupvroot.bat from the One-Time Setup Procedure for the Windows Communication Foundation Samples can be used to create the disk directory and virtual directory.

    2. Kopieren Sie die Dienstprogrammdateien aus %SystemDrive%\Inetpub\wwwroot\servicemodelsamples in das virtuelle Verzeichnis "ServiceModelSamples" auf dem Dienstcomputer.Copy the service program files from %SystemDrive%\Inetpub\wwwroot\servicemodelsamples to the ServiceModelSamples virtual directory on the service machine. Stellen Sie sicher, dass Sie die Dateien in das Verzeichnis \bin einfügen.Be sure to include the files in the \bin directory.

    3. Testen Sie, ob Sie mit einem Browser vom Clientcomputer auf den Dienst zugreifen können.Test that you can access the service from the client machine using a browser.

  2. Einrichten der Clientcomputer:Set up the client machines:

    1. Kopieren Sie die Clientprogrammdateien aus dem Ordner "\client\bin" (unterhalb des sprachspezifischen Ordners) auf die Clientcomputer.Copy the client program files from the \client\bin\ folder, under the language-specific folder, to the client machines.

    2. Ändern Sie in jeder Clientkonfigurationsdatei den Wert für die Adresse der Endpunktdefinition so, dass er mit der neuen Adresse Ihres Diensts übereinstimmt.In each client configuration file, change the address value of the endpoint definition to match the new address of your service. Ersetzen Sie alle Verweise auf localhost in der Adresse durch einen vollqualifizierten Domänennamen.Replace any references to "localhost" with a fully-qualified domain name in the address.

  3. Einrichten des Datenquellencomputers:Set up the data source machine:

    1. Kopieren Sie die Datenquellen-Programmdateien aus dem Ordner "\datasource\bin" (unterhalb des sprachspezifischen Ordners) auf den Datenquellencomputer.Copy the data source program files from the \datasource\bin\ folder, under the language-specific folder, to the data source machine.

    2. Ändern Sie in der Datenquellen-Konfigurationsdatei den Wert für die Adresse der Endpunktdefinition so, dass er mit der neuen Adresse Ihres Diensts übereinstimmt.In the data source configuration file, change the address value of the endpoint definition to match the new address of your service. Ersetzen Sie alle Verweise auf localhost in der Adresse durch einen vollqualifizierten Domänennamen.Replace any references to "localhost" with a fully-qualified domain name in the address.

  4. Starten Sie auf den Clientcomputern in einer Eingabeaufforderung die Datei "Client.exe".On the client machines, launch Client.exe from a command prompt.

  5. Starten Sie auf dem Datenquellencomputer in einer Eingabeaufforderung die Datei "Datasource.exe".On the data source machine, launch Datasource.exe from a command prompt.

Wichtig

Die Beispiele sind möglicherweise bereits auf dem Computer installiert.The samples may already be installed on your machine. Suchen Sie nach dem folgenden Verzeichnis (Standardverzeichnis), bevor Sie fortfahren.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Wenn dieses Verzeichnis nicht vorhanden ist, fahren Sie mit Windows Communication Foundation (WCF) und Windows Workflow Foundation (WF) Samples for .NET Framework 4 aller Windows Communication Foundation (WCF) herunterladen und WFWF Beispiele.If this directory does not exist, go to Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 to download all Windows Communication Foundation (WCF) and WFWF samples. Dieses Beispiel befindet sich im folgenden Verzeichnis.This sample is located in the following directory.

<InstallDrive>:\WF_WCF_Samples\WCF\Scenario\DesignPatterns/ListBasedPublishSubscribe

Siehe auchSee Also