WCF-Chatbeispiel

Aktualisiert: November 2007

Im Chatbeispiel wird veranschaulicht, wie eine Mehrparteienchatanwendung mit PeerChannel implementiert wird. Von einer beliebigen Instanz einer Chatanwendung gesendete Nachrichten werden von allen anderen Instanzen empfangen.

So erhalten Sie Beispiele und Anweisungen zu ihrer Installation

  • Führen Sie eine oder mehrere der folgenden Aktionen aus:

    • Klicken Sie im Menü Hilfe auf Samplings.

      In der Infodatei befinden sich Informationen zu Beispielen.

    • Gehen Sie zur Website mit Visual Studio 2008-Beispielen. Hier stehen die aktuellsten Versionen der Beispiele bereit.

    • Suchen Sie Beispiele auf dem Computer, auf dem Visual Studio installiert wurde. Standardmäßig werden Beispiele und eine Infodatei unter Laufwerk:\Programme\Microsoft Visual Studio 9.0\Beispiele\lcid installiert. Für die Express-Version von Visual Studio werden alle Beispiele online bereitgestellt.

Weitere Informationen finden Sie unter Suchen von Beispieldateien.

Sicherheitshinweis:

Dieser Beispielcode soll lediglich ein Konzept veranschaulichen. Es wird nur der für das jeweilige Konzept relevante Code dargestellt. Möglicherweise erfüllt dieser nicht die Sicherheitsanforderungen für eine bestimmte Umgebung, und er sollte nicht genau wie dargestellt verwendet werden. Wir empfehlen, Sicherheits- und Fehlerbehandlungscode hinzuzufügen, um Ihre Projekte sicherer und stabiler zu machen. Microsoft stellt diesen Beispielcode "wie besehen" und ohne Garantien zur Verfügung.

So führen Sie das Beispiel aus

  1. Öffnen Sie im Projektmappen-Explorer die SLN-Datei.

    Schritte, die sich auf einen Client oder Dienst beziehen, gelten für einzelne Instanzen des Beispiels (da das Chatbeispiel keine Client- und Dienstanwendung ist).

  2. Drücken Sie F5, um die Chatanwendung auszuführen.

  3. Starten Sie die gewünschte Anzahl an Instanzen (benannte Instanz in Visual Basic-Installationspfad\Projects\Chat\Instance\Bin\Debug\Instance.exe). Geben Sie zu Beginn einen Spitznamen ein, der zur Unterscheidung der von einer bestimmten Clientinstanz gesendeten Nachrichten dient. Kurz nachdem Sie diesen Namen eingegeben haben, können Sie Chatnachrichten an das Mesh senden. Diese Nachrichten sollten an alle anderen Instanzen gesendet werden, die über einen eindeutigen Mitgliedsnamen verfügen. (Dies bedeutet, dass eine Nachricht von einem Client mit demselben Namen nicht angezeigt wird und eine eigene Nachricht eines einzelnen Clients nicht an das Konsolenfenster dieses Clients gesendet wird.)

Veranschaulicht

Das Chatbeispiel ist keine Client- und Dienstanwendung. Es ist eine echte Peer-to-Peer-Anwendung, in der jede Instanz als Peer anderer Instanzen fungiert. Jede Instanz kann mit dem IChat-Duplexvertrag Nachrichten an andere Instanzen senden und Nachrichten von anderen Instanzen empfangen.

Hauptkonzepte

PeerChannel ist eine Mehrparteien-, P2P (Peer-to-Peer)-Kommunikationstechnologie in WCF (Windows Communication Foundation). Sie ermöglicht ein sicheres, skalierbares und zuverlässiges Messaging. Ein allgemeines Beispiel für eine Mehrparteienanwendung, die von PeerChannel profitieren kann, ist eine Anwendung für Zusammenarbeit wie Chat. Beim Chatten kommuniziert eine Gruppe von Leuten ohne Server auf einer Peer-to-Peer-Basis miteinander. PeerChannel ermöglicht sowohl für Heimanwender- als auch für Unternehmensszenarien P2P-Zusammenarbeit, Inhaltsverteilung, Lastenausgleich und verteilte Verarbeitung.

Mit PeerChannel werden die folgenden neuen Konzepte eingeführt:

  • Ein Mesh ist eine benannte Auflistung (ein zusammenhängender Graph) von Peerknoten, die untereinander kommunizieren können und anhand einer eindeutigen Mesh-ID identifiziert werden.

    Hinweis:

    Aktive Knoten im Mesh veröffentlichen ihre Meshnamen, damit sie von anderen gefunden werden können. Ein Mesh passt sich an sich ändernde Mitgliedschaften an, verfügt in einer Umgebung, in der dem Mesh ständig Knoten beitreten bzw. das Mesh verlassen, über eine anpassungsfähige Konnektivität und optimiert sich dynamisch, um sich an Muster im Datenverkehr anzupassen.

  • Aktive Knoten im Mesh veröffentlichen ihre Meshnamen, damit sie von anderen gefunden werden können. Ein Mesh passt sich an sich ändernde Mitgliedschaften an, verfügt in einer Umgebung, in der dem Mesh ständig Knoten beitreten bzw. das Mesh verlassen, über eine anpassungsfähige Konnektivität und optimiert sich auf Grundlage von Mustern im Datenverkehr dynamisch.

  • Ein Peerknoten ist ein Endpunkt in einem Mesh. Eine einzelne Anwendung kann über mehrere Peerknoten verfügen, die an verschiedenen Meshes teilnehmen.

  • Eine Peerauflösung ist für das Auflösen einer Mesh-ID in die Endpunktadressen der Knoten im Mesh verantwortlich. Ein Peerknoten verwendet diese Adressen, um eine Verbindung mit anderen Knoten im Mesh herzustellen. Dadurch können Nachrichten über das gesamte Mesh weitergegeben werden.

Chat ist eine Windows Forms-Anwendung. Jede Instanz einer Chatanwendung erstellt einen IDuplexChannel mit der gleichen Endpunktadresse. Da alle Instanzen einer Chatanwendung dieselbe Adresse verwenden, wird eine von einer Instanz der Anwendung gesendete Nachricht von allen anderen Instanzen auf ihren Peerkanälen empfangen.

Die Chatanwendung definiert und implementiert den IChat-Duplexvertrag. Der IChat-Vertrag gestattet nur unidirektionale Operationen, da das ServiceModel das Paradigma Einzelanforderung/Mehrfachantwort nicht unterstützt. (In einem Mehrparteienkanal kann eine einzelne Anforderung, die in das Mesh gesendet wird, mehrere Antworten generieren.)

In diesem Beispiel wird eine statische Main-Funktion implementiert, um einen IClientChannel mit dem IChat-Duplexvertrag zu erstellen. Die Funktion verwendet den Endpunkt, der in der Konfigurationsdatei angegeben wird.

Alle Chatinstanzen müssen dieselbe Endpunktadresse verwenden, um sicherzustellen, dass die von einer Instanz gesendeten Nachrichten von allen anderen Instanzen empfangen werden.

Die Chatinstanzen in diesem Beispiel suchen einander mithilfe eines benutzerdefinierten Resolvers oder mithilfe des Standardpeerresolvers (PNRP). Beachten Sie, dass PNRP unter Windows Server 2003 nicht verfügbar ist. Daher muss auf einem System, auf dem Windows Server 2003 ausgeführt wird, ein benutzerdefinierter Resolver verwendet werden, um dieses Beispiel auszuführen. Das Beispiel ist so eingerichtet, dass standardmäßig ein benutzerdefinierter Resolver verwendet wird. Ob ein benutzerdefinierter Resolver oder der Standardresolver verwendet wird, bestimmt der in der folgenden Konfigurationsdatei definierte Chatendpunkt. Um auf den Standardpeerresolver (PNRP) umzuschalten, ersetzen Sie in der Konfigurationsdatei des Beispiels unter bindingConfiguration den Eintrag BindingCustomResolver durch BindingDefault.

<!-- Chat instance participating in the mesh. -->
         <endpoint name="ChatEndpoint"
                   address="net.p2p://chatMesh/ServiceModelSamples/Chat" 
                   binding="netPeerTcpBinding" 
                   bindingConfiguration="BindingCustomResolver" 
                   contract="Microsoft.ServiceModel.Samples.IChat">
         </endpoint>

Damit der Peerknoten mit dem Peer Channel Custom Peer Resolver-Dienst kommunizieren kann, wird in der Konfigurationsdatei die Clientkonfiguration des Peer Channel Custom Peer Resolvers definiert.

<!-- Client used to communicate with the custom resolver service. -->
<client>
<endpoint configurationName="CustomPeerResolverEndpoint"
address="net.tcp://localhost/ServiceModelsamples/peerResolverService"
    binding="netTcpBinding"
    bindingConfiguration="Binding3"
    contract="Microsoft.ServiceModel.SamplesICustomPeerResolver">
</endpoint>
</client>

Die Adresse gibt die Adresse des Resolverdiensts an. Wenn der Resolverdienst auf einem Remotecomputer ausgeführt wird, ersetzen Sie localhost durch einen qualifizierten Domänennamen.

Im Beispiel wird auch veranschaulicht, wie Sie den Peerknoten aus IClientChannel abrufen und mit IOnlineStatus eine Registrierung für Online- und Offlineereignisse ausführen. Ein Onlineereignis wird initiiert, wenn der Peerknoten eine Verbindung mit mindestens einem anderen Peerknoten im Mesh herstellt. Ein Offlineereignis wird initiiert, wenn der Peerknoten keine Verbindung mehr mit einem anderen Peerknoten im Mesh hat.

Derzeit können keine Metadaten generiert werden, da im Dienstprogramm für Dienstmetadaten (Svcutil.exe) kein Peerkanal integriert ist.

Wenn Sie das Beispiel ausführen, werden die von einer Chatinstanz gesendeten Nachrichten in den Konsolenfenstern der anderen Chatinstanzen angezeigt. Drücken Sie in den einzelnen Konsolenfenstern die Q-Taste und anschließend die EINGABETASTE, um die Instanzen zu schließen.

Hinweis:

Im Beispiel werden derzeit nicht alle möglichen Ausnahmen behandelt, die von der Infrastruktur ausgelöst werden können. Wenn Sie diese Beispiele in einer kommerziellen Umgebung oder in einer Produktionsumgebung verwenden, sollten Sie die geeigneten bewährten Methoden zur Ausnahmebehandlung befolgen.

Siehe auch

Aufgaben

Exemplarische Vorgehensweise: Erstellen von und Zugreifen auf WCF-Dienste

Beispiel zur Verwendung von ASMX- und WCF-Diensten