Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
L'esempio ListBasedPublishSubscribe mostra il modello Publish-Subscribe basato su liste, implementato come programma della Windows Communication Foundation (WCF).
Annotazioni
La procedura di installazione e le istruzioni di compilazione per questo esempio si trovano alla fine di questo argomento.
Il modello di progettazione basato su elenco Publish-Subscribe è descritto nella pubblicazione Modelli e procedure Microsoft, Modelli di integrazione. Il modello Publish-Subscribe passa informazioni a una raccolta di destinatari che hanno sottoscritto un argomento informativo. La pubblicazione-sottoscrizione basata su elenco mantiene un elenco di abbonati. Quando sono presenti informazioni da condividere, viene inviata una copia a ogni sottoscrittore nell'elenco. In questo esempio viene illustrato un modello di pubblicazione-sottoscrizione basato su elenco dinamico, in cui i client possono sottoscrivere o annullare la sottoscrizione come richiesto.
L'esempio Publish-Subscribe basato su elenco è costituito da un client, un servizio e un programma sorgente di dati. Possono essere in esecuzione più client e più programmi di origine dati. I client sottoscrivono il servizio, ricevono notifiche e annullano la sottoscrizione. I programmi dei dati inviano informazioni al servizio da condividere con tutti gli abbonati correnti.
In questo esempio, il client e l'origine dati sono programmi console (.exe file) e il servizio è una libreria (.dll) ospitata in Internet Information Services (IIS). L'attività del client e dell'origine dati sono visibili sul desktop.
Il servizio usa la comunicazione duplex. Il ISampleContract contratto di servizio è associato a un ISampleClientCallback contratto di callback. Il servizio implementa le operazioni di servizio di sottoscrizione e disiscrizione, che i client usano per entrare o uscire dall'elenco dei sottoscrittori. Il servizio implementa anche l'operazione del servizio PublishPriceChange, che il programma della sorgente dati chiama per fornire nuove informazioni al servizio. Il programma client implementa l'operazione PriceChange del servizio, che il servizio chiama per notificare a tutti i sottoscrittori una modifica dei prezzi.
// 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 usa un evento .NET Framework come meccanismo per informare tutti i sottoscrittori sulle nuove informazioni. Quando un client viene aggiunto al servizio chiamando Subscribe, fornisce un gestore eventi. Quando un client esce, annulla la sottoscrizione del gestore eventi all'evento. Quando un'origine dati chiama il servizio per segnalare una modifica del prezzo, il servizio attiva l'evento. Questa operazione chiama ogni istanza del servizio, una per ogni client che ha sottoscritto l'abbonamento, causando l'esecuzione dei loro gestori di eventi. Ogni gestore eventi passa le informazioni al client tramite la relativa 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 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);
}
}
Quando esegui l'esempio, avvia diversi clienti. I client sottoscrivono il servizio. Eseguire quindi il programma origine dati, che invia informazioni al servizio. Il servizio passa le informazioni a tutti i sottoscrittori. È possibile visualizzare l'attività in ogni console client che conferma che le informazioni sono state ricevute. Premere INVIO nella finestra del client per chiudere il client.
Per configurare e compilare l'esempio
Assicurati di aver eseguito la procedura di installazione di One-Time per gli esempi di Windows Communication Foundation.
Per compilare l'edizione C# o Visual Basic .NET della soluzione, seguire le istruzioni in Compilazione degli esempi di Windows Communication Foundation.
Per eseguire l'esempio nello stesso computer
Verificare che sia possibile accedere al servizio usando un browser immettendo l'indirizzo seguente:
http://localhost/servicemodelsamples/service.svc. Una pagina di conferma deve essere visualizzata in risposta.Esegui Client.exe da \client\bin\, dalla cartella specifica della lingua. L'attività client viene visualizzata nella finestra della console client. Avvia diversi client.
Eseguire Datasource.exe dalla cartella specifica della lingua, sotto \datasource\bin\. L'attività della fonte dati viene visualizzata nella finestra della console. Dopo che l'origine dati invia informazioni al servizio, queste dovrebbero essere inviate a ciascun client.
Se il client, l'origine dati e i programmi di servizio non sono in grado di comunicare, vedere Suggerimenti per la risoluzione dei problemi per esempi WCF.
Per eseguire l'esempio tra computer
Configurare il computer del servizio:
Nel computer del servizio creare una directory virtuale denominata ServiceModelSamples. Il file batch Setupvroot.bat della Procedura di installazioneOne-Time per i campioni di Windows Communication Foundation può essere utilizzato per creare la directory del disco e la directory virtuale.
Copiare i file di programma del servizio da %SystemDrive%\Inetpub\wwwroot\servicemodelsamples nella directory virtuale ServiceModelSamples nel computer del servizio. Assicurarsi di includere i file nella directory \bin.
Verificare che sia possibile accedere al servizio dal computer client usando un browser.
Configurare i computer client:
Copiare i file di programma client dalla cartella \client\bin\ nella cartella specifica della lingua nei computer client.
In ogni file di configurazione del client, modifica il valore dell'indirizzo della definizione dell'endpoint affinché corrisponda al nuovo indirizzo del servizio. Sostituire tutti i riferimenti a "localhost" con un nome di dominio completo nell'indirizzo.
Configurare la macchina della sorgente di dati
Copia i file del programma di origine dati dalla cartella \datasource\bin\, situata nella cartella specifica della lingua, alla macchina dell'origine dati.
Nel file di configurazione dell'origine dati, modifica il valore dell'indirizzo della definizione dell'endpoint affinché corrisponda al nuovo indirizzo del tuo servizio. Sostituire tutti i riferimenti a "localhost" con un nome di dominio completo nell'indirizzo.
Sulle macchine client, lanciare Client.exe da un prompt dei comandi.
Sulla macchina dell'origine dati, avviare Datasource.exe dal prompt dei comandi.