Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
El ejemplo ListBasedPublishSubscribe ilustra el patrón basado en listas Publish-Subscribe, implementado como un programa de Windows Communication Foundation (WCF).
Nota:
El procedimiento de instalación y las instrucciones de compilación de este ejemplo se encuentran al final de este tema.
El patrón de diseño de Publish-Subscribe basado en listas se describe en la publicación Patrones y prácticas de Microsoft, Patrones de integración. El patrón Publish-Subscribe pasa información a una colección de destinatarios que se han suscrito a un tema de información. El modelo de publicación-suscripción basado en listas mantiene una lista de suscriptores. Cuando hay información para compartir, se envía una copia a cada suscriptor de la lista. En este ejemplo se muestra un patrón dinámico de publicación y suscripción basada en listas, donde los clientes pueden suscribirse o cancelar la suscripción con la frecuencia necesaria.
El ejemplo de Publish-Subscribe basado en lista consta de un cliente, un servicio y un programa de origen de datos. Puede haber más de un cliente y más de un programa de origen de datos en ejecución. Los clientes se suscriben al servicio, reciben notificaciones y cancelan la suscripción. Los programas de origen de datos envían información al servicio para compartirse con todos los suscriptores actuales.
En este ejemplo, el cliente y el origen de datos son programas de consola ( archivos.exe) y el servicio es una biblioteca (.dll) hospedada en Internet Information Services (IIS). La actividad del cliente y del origen de datos están visibles en el escritorio.
El servicio utiliza la comunicación dúplex. El contrato de servicios ISampleContract se empareja a con un contrato de devolución de llamada ISampleClientCallback. El servicio implementa las operaciones de suscripción y cancelación de suscripción, que los clientes usan para unirse o dejar la lista de suscriptores. El servicio también implementa la PublishPriceChange operación de servicio, a la que llama el programa de origen de datos para proporcionar al servicio información nueva. El programa cliente implementa la operación de servicio PriceChange a la que el servicio llama para notificar a todos los suscriptores de un cambio del precio.
// 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);
}
El servicio usa un evento de .NET Framework como mecanismo para informar a todos los suscriptores sobre la nueva información. Cuando un cliente se une al servicio llamando a Subscribe, proporciona un controlador de eventos. Cuando un cliente sale de la lista, cancela la suscripción de su controlador de eventos desde el evento. Cuando un origen de datos llama al servicio para notificar un cambio de precio, el servicio genera el evento. Esto llama a cada instancia del servicio, una para cada cliente que se ha suscrito y hace que se ejecuten sus controladores de eventos. Cada controlador de eventos pasa la información a su cliente a través de su función de devolución de llamada.
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);
}
}
Al ejecutar el ejemplo, inicie varios clientes. Los clientes se suscriben al servicio. A continuación, ejecute el programa de origen de datos, que envía información al servicio. El servicio pasa la información a todos los suscriptores. Verá actividad en cada consola de cliente confirmando que la información ha sido recibida. Presione ENTRAR en la ventana del cliente para apagar el cliente.
Para instalar y compilar el ejemplo
Asegúrese de que ha realizado el procedimiento de instalación única para los ejemplos de Windows Communication Foundation.
Para compilar el código C# o Visual Basic .NET Edition de la solución, siga las instrucciones de Building the Windows Communication Foundation Samples.
Para ejecutar el ejemplo en la misma máquina
Pruebe que puede acceder al servicio mediante un explorador escribiendo la siguiente dirección:
http://localhost/servicemodelsamples/service.svc. Se debe mostrar una página de confirmación en respuesta.Ejecute Client.exe desde \client\bin\, desde la carpeta específica del lenguaje. La actividad de cliente se muestra en la ventana de la consola del cliente. Inicie varios clientes.
Ejecute Datasource.exe desde \datasource\bin\, dentro de la carpeta específica del idioma. La actividad del origen de los datos se muestra en la ventana de la consola. Una vez que el origen de datos envía información al servicio, se debe transmitir a cada cliente.
Si el cliente, el origen de datos y los programas de servicio no pueden comunicarse, consulte Sugerencias de solución de problemas para ejemplos de WCF.
Para ejecutar el ejemplo en varias máquinas
Configure la máquina de servicio:
En la máquina de servicio, cree un directorio virtual denominado ServiceModelSamples. El archivo por lotes Setupvroot.bat del procedimiento de configuración deOne-Time para Windows Communication Foundation Samples se puede usar para crear el directorio de disco y el directorio virtual.
Copie los archivos de programa de servicio de %SystemDrive%\Inetpub\wwwroot\servicemodelsamples en el directorio virtual ServiceModelSamples de la máquina de servicio. Asegúrese de incluir los archivos en el directorio \bin.
Pruebe que puede acceder al servicio desde la máquina cliente mediante un explorador.
Configure las máquinas cliente:
Copie los archivos de programa cliente de la carpeta \client\bin\, en la carpeta específica del idioma, en las máquinas cliente.
En cada archivo de configuración de cliente, cambie el valor de dirección de la definición del punto de conexión para que coincida con la nueva dirección del servicio. Reemplace las referencias a "localhost" por un nombre de dominio completo en la dirección.
Preparar el equipo del origen de datos:
Copie los archivos de programa de origen de datos de la carpeta \ datasource \bin\, en la carpeta específica del lenguaje, al equipo del origen de datos.
En el archivo de configuración del origen de datos, cambie el valor de dirección de la definición del punto de conexión para que coincida con la nueva dirección del servicio. Reemplace las referencias a "localhost" por un nombre de dominio completo en la dirección.
En los equipos cliente, inicie Client.exe desde el símbolo del sistema.
En la máquina fuente de datos, inicie Datasource.exe desde una línea de comandos.