Condividi tramite


Esempio di chat WCF

Aggiornamento: novembre 2007

Nell'esempio di chat viene illustrato come implementare un'applicazione di chat a più utenti utilizzando il canale Peer. I messaggi inviati da qualsiasi istanza di un'applicazione di chat vengono ricevuti da tutte le altre istanze.

Per ottenere esempi e istruzioni per la relativa installazione

  • Effettuare una delle seguenti operazioni:

    • Dal menu Guida, scegliere Esempi.

      Il file Readme contiene informazioni sugli esempi.

    • Visitare il sito Web Visual Studio 2008 Samples (informazioni in lingua inglese). Su tale sito sono disponibili le versioni più recenti degli esempi.

    • Individuare gli esempi sul computer in cui è installato Visual Studio. Il percorso di installazione predefinito degli esempi e del file Readme relativo è unità:\Programmi\Microsoft Visual Studio 9.0\Samples\lcid. Per le versioni Express di Visual Studio tutti gli esempi sono disponibili in linea.

Per ulteriori informazioni, vedere Individuazione dei file di esempio.

Nota sulla sicurezza:

In questo esempio di codice viene illustrato un concetto e viene presentato solo il codice rilevante. È possibile che questo esempio non soddisfi i requisiti di sicurezza per un ambiente specifico ed è opportuno non utilizzarlo così come viene riportato. È consigliabile aggiungere codice relativo alla sicurezza e alla gestione degli errori per rendere i progetti più sicuri e potenti. Microsoft fornisce questo esempio di codice "COSÌ COM'È" senza garanzie.

Per eseguire l’esempio

  1. In Esplora soluzioni aprire il file .sln.

    Quando un passaggio fa riferimento a un client o a un servizio, tale passaggio si applica a istanze separate dell'esempio (poiché l'esempio di chat non rappresenta un'applicazione client e di servizio).

  2. ‎Premere F5 per eseguire l'applicazione di chat.

  3. Avviare tutte le istanze desiderate (ovvero, un'istanza denominata e situata in Percorso di installazione di Visual Basic\Projects\Chat\Instance\Bin\Debug\Instance.exe). Iniziare con l'immissione di un nome alternativo che distinguerà i messaggi inviati da una determinata istanza del client. Subito dopo l'immissione del nome, è possibile inviare i messaggi di chat alla rete mesh. Questi messaggi devono essere inviati a tutte le altre istanze con un nome di membro diverso (ovvero, un messaggio di un client che presenta lo stesso nome non verrà visualizzato e il messaggio specifico di un singolo client non verrà inviato alla finestra della console di tale client).

Dimostrazione

L'esempio di chat non rappresenta un'applicazione client e di servizio, ma una vera applicazione peer-to-peer in cui ogni istanza svolge la funzione di peer delle altre istanze. Ogni istanza può infatti inviare messaggi alle altre istanze e ricevere messaggi da queste utilizzando il contratto duplex IChat.

Concetti principali

Il canale Peer rappresenta una tecnologia di comunicazione peer-to-peer (P2P) a più utenti inclusa in Windows Communication Foundation (WCF), che consente di attivare un sistema di messaggistica sicuro, scalabile e affidabile. Un esempio comune di applicazione a più utenti che può beneficiare del canale Peer è costituito da un'applicazione collaborativa, quale una chat. In una chat, un gruppo di persone comunica l'una con l'altra mediante un sistema peer-to-peer senza server. Il canale Peer consente la collaborazione P2P, la distribuzione di contenuti, il bilanciamento del carico e l'elaborazione distribuita per scenari aziendali e relativi a utenti.

Con il canale Peer vengono introdotti questi nuovi concetti:

  • Una rete mesh rappresenta un insieme denominato (ovvero, un grafico interconnesso) di nodi Peer che possono comunicare tra loro e che sono identificati ciascuno da un ID di rete mesh univoco.

    Nota:

    I nodi attivi nella rete mesh pubblicano i rispettivi nomi di rete mesh in modo da poter essere individuati dagli altri nodi. Una rete mesh si adatta alle modifica di appartenenza, dispone di una connettività adattabile in un ambiente in cui i nodi si collegano e si scollegano continuamente dalla rete mesh ed è ottimizzata dinamicamente per adattarsi ai diversi modelli di traffico.

  • I nodi attivi nella rete mesh pubblicano i rispettivi nomi di rete mesh in modo da poter essere individuati dagli altri nodi. Una rete mesh si adatta alle modifica di appartenenza, dispone di una connettività adattabile in un ambiente in cui i nodi si collegano e si scollegano continuamente dalla rete mesh ed è ottimizzata dinamicamente in base ai diversi modelli di traffico.

  • Un nodo Peer rappresenta un endpoint in una rete mesh. Una singola applicazione può disporre di più nodi Peer che partecipano a reti mesh diverse.

  • Un resolver Peer è responsabile della risoluzione dell'ID di una rete mesh negli indirizzi endpoint dei nodi della rete mesh. Questi indirizzi vengono utilizzati da un nodo Peer per connettersi ad altri nodi della rete mesh. In tal modo, è possibile la propagazione dei messaggi in tutta la rete mesh.

La chat rappresenta un'applicazione Windows Form. Ogni istanza di un'applicazione di chat crea un oggetto IDuplexChannel che presenta lo stesso indirizzo endpoint. Poiché tutte le istanze di un'applicazione di chat utilizzano lo stesso indirizzo, un messaggio inviato da un'istanza dell'applicazione viene ricevuto da tutte le altre istanze del relativo canale Peer.

L'applicazione di chat definisce e implementa il contratto duplex IChat. Tale contratto consente solo operazioni unidirezionali, poiché ServiceModel non supporta il paradigma richiesta singola /risposta multipla (in un canale a più utenti, una singola richiesta inviata alla rete mesh può generare più risposte).

In questo esempio viene implementata una funzione Main statica per creare un oggetto IClientChannel con il contratto duplex IChat. La funzione utilizza l'endpoint specificato nel file di configurazione.

Le istanze di chat devono utilizzare tutte lo stesso indirizzo endpoint per assicurare che i messaggi inviati da un'istanza vengano ricevuti da tutte le altre.

Le istanze di chat di questo esempio si individuano reciprocamente utilizzando un resolver personalizzato o il resolver Peer predefinito (PNRP). Il PNRP non è disponibile in Windows Server 2003. Pertanto, è necessario utilizzare un resolver personalizzato per eseguire questo esempio in un sistema su cui è in esecuzione Windows Server 2003. Per impostazione predefinita, l'esempio viene configurato per l'utilizzo di un resolver personalizzato. L'utilizzo di un resolver personalizzato o del resolver predefinito viene determinato dall'endpoint di chat definito nel file di configurazione riportato di seguito. Per passare al resolver Peer predefinito (PNRP), sostituire BindingCustomResolver con BindingDefault all'interno di bindingConfiguration nel file di configurazione dell'esempio.

<!-- 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>

Per consentire al nodo Peer di comunicare con il servizio del resolver Peer personalizzato del canale Peer, la configurazione sul lato client di tale servizio viene definita nel file di configurazione.

<!-- 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>

L'indirizzo identifica quello del servizio resolver. Se il servizio resolver è in esecuzione su un computer remoto, sostituire localhost con un nome di dominio completo.

Nell'esempio viene illustrato anche come recuperare il nodo Peer da IClientChannel e come registrarsi per gli eventi in linea e non in linea utilizzando IOnlineStatus. Un evento in linea viene generato quando il nodo Peer è connesso ad almeno un altro nodo Peer nella rete mesh. Un evento non in linea viene generato, invece, quando il nodo Peer non è più connesso ad altri nodi Peer nella rete mesh.

Attualmente, non è possibile generare metadati poiché un canale Peer non è integrato con l'utilità dei metadati del servizio (Svcutil.exe).

Quando si esegue l'esempio, i messaggi di chat inviati da un'istanza di chat vengono visualizzati nelle finestre della console di altre istanze di chat. Premere il tasto Q seguito da INVIO in ogni finestra della console per chiudere l'istanza.

Nota:

L'esempio non gestisce attualmente tutte le eccezioni che possono essere generate dall'infrastruttura. Se si utilizzano questi esempi in un ambiente di produzione o commerciale, seguire le procedure consigliate di gestione delle eccezioni adatte al caso.

Vedere anche

Attività

Procedura dettagliata: creazione e accesso ai servizi WCF

Esempio di utilizzo di servizi ASMX e WCF