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.
En este ejemplo Volátil, se muestra cómo realizar la comunicación en cola volátil sobre el transporte de Message Queue Server (MSMQ). En este ejemplo se usa NetMsmqBinding. El servicio en este caso es una aplicación de consola hospedada a sí misma que le permite observar el servicio que recibe los mensajes en cola.
Nota:
El procedimiento de instalación y las instrucciones de compilación de este ejemplo se encuentran al final de este tema.
En la comunicación con colas, el cliente se comunica con el servicio mediante una cola. Más precisamente, el cliente envía mensajes a una cola. El servicio recibe mensajes de la cola. El servicio y el cliente no necesitan ejecutarse simultáneamente para comunicarse mediante una cola.
Cuando se envía un mensaje sin garantías, MSMQ solo realiza un mejor esfuerzo para entregar el mensaje, a diferencia de las garantías Exactamente Una vez en las que MSMQ garantiza que el mensaje se entregue o, si no se puede entregar, le permite saber que el mensaje no se puede entregar.
En determinados escenarios, es posible que desee enviar un mensaje volátil sin garantías a través de una cola, cuando la entrega oportuna es más importante que perder mensajes. Los mensajes volátiles no sobreviven en caso de fallos del gestor de colas. Por lo tanto, si el administrador de colas se bloquea, la cola no transaccional utilizada para almacenar mensajes volátiles sobrevive, pero los mensajes en sí no lo hacen porque no se almacenan en el disco.
Nota:
No se pueden enviar mensajes volátiles sin garantías dentro del ámbito de una transacción mediante MSMQ. También debe crear una cola no transaccional para enviar mensajes volátiles.
El contrato de servicio de este ejemplo es IStockTicker que define los servicios unidireccionales más adecuados para su uso con colas.
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface IStockTicker
{
[OperationContract(IsOneWay = true)]
void StockTick(string symbol, float price);
}
La operación de servicio muestra el símbolo y precios del tablero de cotizaciones, tal y como se muestra en el código de ejemplo siguiente:
public class StockTickerService : IStockTicker
{
public void StockTick(string symbol, float price)
{
Console.WriteLine("Stock Tick {0}:{1} ", symbol, price);
}
…
}
El servicio se hospeda en sí mismo. Al utilizar el transporte de MSMQ, se debe crear la cola utilizada de antemano. Esto se puede hacer manualmente o a través del código. En este ejemplo, el servicio contiene código para comprobar la existencia de la cola y crearlo si es necesario. El nombre de la cola se lee del archivo de configuración. La herramienta de utilidad de metadatos serviceModel usa la dirección base (Svcutil.exe) para generar el proxy para el servicio.
// Host the service within this EXE console application.
public static void Main()
{
// Get MSMQ queue name from app settings in configuration.
string queueName = ConfigurationManager.AppSettings["queueName"];
// Create the transacted MSMQ queue if necessary.
if (!MessageQueue.Exists(queueName))
MessageQueue.Create(queueName);
// Create a ServiceHost for the StockTickerService type.
using (ServiceHost serviceHost = new ServiceHost(typeof(StockTickerService)))
{
// Open the ServiceHost to create listeners and start listening for messages.
serviceHost.Open();
// The service can now be accessed.
Console.WriteLine("The service is ready.");
Console.WriteLine("Press <ENTER> to terminate service.");
Console.WriteLine();
Console.ReadLine();
// Close the ServiceHost to shutdown the service.
serviceHost.Close();
}
}
El nombre de la cola MSMQ se especifica en la sección appSettings del archivo de configuración. El punto de conexión del servicio se define en la sección system.serviceModel del archivo de configuración y especifica la vinculación netMsmqBinding.
Nota:
El nombre de la cola usa un punto (.) para el equipo local y separadores con barra diagonal inversa en su ruta de acceso al crear una cola mediante System.Messaging. La dirección de punto de conexión de Windows Communication Foundation (WCF) especifica un esquema net.msmq:, utiliza "localhost" para el equipo local y utiliza barras diagonales en su ruta de acceso.
Las garantías y durabilidad o volatilidad de los mensajes también se especifican en la configuración.
<appSettings>
<!-- use appSetting to configure MSMQ queue name -->
<add key="queueName" value=".\private$\ServiceModelSamplesVolatile" />
</appSettings>
<system.serviceModel>
<services>
<service name="Microsoft.ServiceModel.Samples.StockTickerService"
behaviorConfiguration="CalculatorServiceBehavior">
...
<!-- Define NetMsmqEndpoint -->
<endpoint address="net.msmq://localhost/private/ServiceModelSamplesVolatile"
binding="netMsmqBinding"
bindingConfiguration="volatileBinding"
contract="Microsoft.ServiceModel.Samples.IStockTicker" />
...
</service>
</services>
<bindings>
<netMsmqBinding>
<binding name="volatileBinding"
durable="false"
exactlyOnce="false"/>
</netMsmqBinding>
</bindings>
...
</system.serviceModel>
Dado que el ejemplo envía los mensajes en cola utilizando una cola no transaccional, los mensajes con transacciones no se pueden enviar a la cola.
// Create a client.
Random r = new Random(137);
StockTickerClient client = new StockTickerClient();
float price = 43.23F;
for (int i = 0; i < 10; i++)
{
float increment = 0.01f * (r.Next(10));
client.StockTick("zzz" + i, price + increment);
}
//Closing the client gracefully cleans up resources.
client.Close();
Al ejecutar el ejemplo, las actividades de cliente y servicio se muestran en las ventanas de servicio y consola de cliente. Puede ver que el servicio recibe mensajes del cliente. Presione Entrar en cada ventana de la consola para cerrar el servicio y el cliente. Tenga en cuenta que, dado que la espera está en uso, el cliente y el servicio no tienen que funcionar al mismo tiempo. Puede ejecutar el cliente, apagarlo y, a continuación, iniciar el servicio y seguir recibiendo sus mensajes.
The service is ready.
Press <ENTER> to terminate service.
Stock Tick zzz0:43.25
Stock Tick zzz1:43.23
Stock Tick zzz2:43.28
Stock Tick zzz3:43.3
Stock Tick zzz4:43.23
Stock Tick zzz5:43.25
Stock Tick zzz6:43.25
Stock Tick zzz7:43.24
Stock Tick zzz8:43.32
Stock Tick zzz9:43.3
Para configurar, compilar y ejecutar 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 una configuración de una máquina única o entre máquinas, siga las instrucciones de Ejecución de los ejemplos de Windows Communication Foundation.
De forma predeterminada, con NetMsmqBinding, la seguridad de transporte está habilitada. Hay dos propiedades pertinentes para la seguridad de transporte de MSMQ, MsmqAuthenticationMode y MsmqProtectionLevel.. De forma predeterminada, el modo de autenticación se establece en Windows y el nivel de protección se establece en Sign. Para que MSMQ proporcione la característica de autenticación y firma, debe formar parte de un dominio y la opción de integración de Active Directory para MSMQ debe estar instalada. Si ejecuta este ejemplo en un equipo que no cumple estos criterios, recibirá un error.
Para ejecutar el ejemplo en un equipo unido a un grupo de trabajo o sin integración de Active Directory
Si el equipo no forma parte de un dominio o no tiene instalada la integración de Active Directory, desactive la seguridad de transporte estableciendo el modo de autenticación y el nivel
Nonede protección en como se muestra en el código de configuración de ejemplo siguiente:<system.serviceModel> <services> <service name="Microsoft.ServiceModel.Samples.StockTickerService" behaviorConfiguration="StockTickerServiceBehavior"> <host> <baseAddresses> <add baseAddress="http://localhost:8000/ServiceModelSamples/service"/> </baseAddresses> </host> <!-- Define NetMsmqEndpoint --> <endpoint address="net.msmq://localhost/private/ServiceModelSamplesVolatile" binding="netMsmqBinding" bindingConfiguration="volatileBinding" contract="Microsoft.ServiceModel.Samples.IStockTicker" /> <!-- the mex endpoint is exposed at http://localhost:8000/ServiceModelSamples/service/mex --> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> </service> </services> <bindings> <netMsmqBinding> <binding name="volatileBinding" durable="false" exactlyOnce="false"> <security mode="None" /> </binding> </netMsmqBinding> </bindings> <behaviors> <serviceBehaviors> <behavior name="StockTickerServiceBehavior"> <serviceMetadata httpGetEnabled="True"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel>Asegúrese de cambiar la configuración tanto en el servidor como en el cliente antes de ejecutar el ejemplo.
Nota:
Establecer
security modeenNonees equivalente a establecer MsmqAuthenticationMode, MsmqProtectionLevelyMessageseguridad enNone.