Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
L’exemple MsmqToWcf montre comment une application Message Queuing (MSMQ) peut envoyer un message MSMQ à un service Windows Communication Foundation (WCF). Le service est une application console auto-hébergée pour vous permettre d’observer le service recevant des messages mis en file d’attente.
Le contrat de service est IOrderProcessor, qui définit un service unidirectionnel qui convient pour une utilisation avec des files d’attente. Un message MSMQ n’a pas d’en-tête Action. Il n’est donc pas possible de mapper automatiquement différents messages MSMQ aux contrats d’opération. Par conséquent, il ne peut y avoir qu’un seul contrat d’opération. Si vous souhaitez spécifier plusieurs contrats d’opération pour le service, l’application doit fournir des informations sur lequel des en-têtes du message MSMQ (par exemple, l’étiquette ou l’ID de corrélation) peuvent être utilisés pour déterminer quel contrat d’opération doit être distribué.
Le message MSMQ ne contient pas d’informations sur les en-têtes mappés aux différents paramètres du contrat d’opération. Le paramètre est de type MsmqMessage<T>(MsmqMessage<T>), qui contient le message MSMQ sous-jacent. Le type « T » dans la MsmqMessage<T>classe (MsmqMessage<T>) représente les données sérialisées dans le corps du message MSMQ. Dans cet exemple, le PurchaseOrder type est sérialisé dans le corps du message MSMQ.
L’exemple de code suivant montre le contrat de service du service de traitement des commandes.
// Define a service contract.
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
[ServiceKnownType(typeof(PurchaseOrder))]
public interface IOrderProcessor
{
[OperationContract(IsOneWay = true, Action = "*")]
void SubmitPurchaseOrder(MsmqMessage<PurchaseOrder> msg);
}
Le service est auto-hébergé. Lorsque vous utilisez MSMQ, la file d’attente utilisée doit être créée à l’avance. Cette opération peut être effectuée manuellement ou via du code. Dans cet exemple, le service vérifie l’existence de la file d’attente et le crée si nécessaire. Le nom de la file d’attente est lu à partir du fichier de configuration.
public static void Main()
{
// Get the MSMQ queue name from the application settings in
// configuration.
string queueName = ConfigurationManager.AppSettings["queueName"];
// Create the MSMQ queue if necessary.
if (!MessageQueue.Exists(queueName))
MessageQueue.Create(queueName, true);
…
}
Le service crée et ouvre une ServiceHost pour le OrderProcessorService, comme illustré dans l’exemple de code suivant.
using (ServiceHost serviceHost = new ServiceHost(typeof(OrderProcessorService)))
{
serviceHost.Open();
Console.WriteLine("The service is ready.");
Console.WriteLine("Press <ENTER> to terminate service.");
Console.ReadLine();
serviceHost.Close();
}
Le nom de la file d’attente MSMQ est spécifié dans une section appSettings du fichier de configuration, comme indiqué dans l’exemple de configuration suivant.
Remarque
Le nom de la file d'attente utilise un point (.) pour l'ordinateur local et des barres obliques inverses comme séparateur dans son chemin d'accès. L’adresse du point de terminaison WCF spécifie un schéma msmq.formatname et utilise localhost pour l’ordinateur local. L'adresse de la file d'attente pour les règles d'adressage de chaque nom de format MSMQ suit le schéma msmq.formatname.
<appSettings>
<add key="orderQueueName" value=".\private$\Orders" />
</appSettings>
L’application cliente est une application MSMQ qui utilise la Send méthode pour envoyer un message durable et transactionnel à la file d’attente, comme indiqué dans l’exemple de code suivant.
//Connect to the queue.
MessageQueue orderQueue = new MessageQueue(ConfigurationManager.AppSettings["orderQueueName"]);
// Create the purchase order.
PurchaseOrder po = new PurchaseOrder();
po.CustomerId = "somecustomer.com";
po.PONumber = Guid.NewGuid().ToString();
PurchaseOrderLineItem lineItem1 = new PurchaseOrderLineItem();
lineItem1.ProductId = "Blue Widget";
lineItem1.Quantity = 54;
lineItem1.UnitCost = 29.99F;
PurchaseOrderLineItem lineItem2 = new PurchaseOrderLineItem();
lineItem2.ProductId = "Red Widget";
lineItem2.Quantity = 890;
lineItem2.UnitCost = 45.89F;
po.orderLineItems = new PurchaseOrderLineItem[2];
po.orderLineItems[0] = lineItem1;
po.orderLineItems[1] = lineItem2;
// Submit the purchase order.
Message msg = new Message();
msg.Body = po;
//Create a transaction scope.
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
orderQueue.Send(msg, MessageQueueTransactionType.Automatic);
// Complete the transaction.
scope.Complete();
}
Console.WriteLine("Placed the order:{0}", po);
Console.WriteLine("Press <ENTER> to terminate client.");
Console.ReadLine();
Lorsque vous exécutez l’exemple, les activités du client et du service s’affichent dans les fenêtres de la console du service et du client. Vous pouvez voir le service recevoir des messages du client. Appuyez sur Entrée dans chaque fenêtre de console pour arrêter le service et le client. Notez que, étant donné que la mise en file d’attente est en cours d’utilisation, le client et le service n’ont pas besoin d’être opérationnel en même temps. Par exemple, vous pouvez exécuter le client, l’arrêter, puis démarrer le service et recevoir ses messages.
Configurer, générer et exécuter l’exemple
Assurez-vous d’avoir effectué la Procédure d’installation unique pour les exemples Windows Communication Foundation.
Si le service est exécuté en premier, il vérifie que la file d’attente est présente. Si la file d’attente n’est pas présente, le service en crée un. Vous pouvez d’abord exécuter le service pour créer la file d’attente, ou en créer un via le Gestionnaire de files d’attente MSMQ. Suivez ces étapes pour créer une file d’attente dans Windows 2008.
Ouvrez le Gestionnaire de serveur dans Visual Studio 2012.
Développez l’onglet Fonctionnalités.
Cliquez avec le bouton droit sur file d’attente de messages privés, puis sélectionnez Nouveau, file d’attente privée.
Activez la case à cocher Transactionnelle.
Entrez
ServiceModelSamplesTransactedcomme nom de la nouvelle file d’attente.
Pour générer l’édition C# ou Visual Basic .NET de la solution, conformez-vous aux instructions figurant dans Building the Windows Communication Foundation Samples.
Pour exécuter l’exemple dans une configuration à ordinateur unique, suivez les instructions de l’exécution des exemples Windows Communication Foundation.
Exécuter l’exemple sur les ordinateurs
Copiez les fichiers de programme de service à partir du dossier \service\bin\, sous le dossier spécifique à la langue, sur l’ordinateur de service.
Copiez les fichiers de programme client à partir du dossier \client\bin\, sous le dossier spécifique à la langue, sur l’ordinateur client.
Dans le fichier Client.exe.config, modifiez orderQueueName pour spécifier le nom de l’ordinateur de service au lieu de « ».
Sur l'ordinateur de service, lancez Service.exe à partir d'une invite de commandes.
Sur l’ordinateur client, lancez Client.exe à partir d’une invite de commande.