Condividi tramite


Accodamento messaggi a Windows Communication Foundation

L'esempio MsmqToWcf illustra come un'applicazione di Accodamento messaggi (MSMQ) può inviare un messaggio MSMQ a un servizio Windows Communication Foundation (WCF). Il servizio è un'applicazione console autogestita che permette di osservare la ricezione di messaggi in coda da parte del servizio.

Il contratto di servizio è IOrderProcessor, che definisce un servizio unidirezionale adatto per l'uso con le code. Un messaggio MSMQ non dispone di un'intestazione Action, pertanto non è possibile eseguire automaticamente il mapping di messaggi MSMQ diversi ai contratti operativi. Pertanto, può essere presente un solo contratto di operazione. Se si desidera definire più di un contratto di operazione per il servizio, l'applicazione deve fornire informazioni su quale intestazione nel messaggio MSMQ (ad esempio, l'etichetta o "correlationID") può essere usata per decidere quale contratto di operazione attivare.

Il messaggio MSMQ non contiene informazioni su quali intestazioni sono mappate ai diversi parametri del contratto operativo. Il parametro è di tipo MsmqMessage<T>(MsmqMessage<T>), che contiene il messaggio MSMQ sottostante. Il tipo "T" nella MsmqMessage<T>classe (MsmqMessage<T>) rappresenta i dati serializzati nel corpo del messaggio MSMQ. In questo esempio, il PurchaseOrder tipo viene serializzato nel corpo del messaggio MSMQ.

Il codice di esempio seguente illustra il contratto di servizio del servizio di elaborazione degli ordini.

// 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);
}

Il servizio è autogestito. Quando si usa MSMQ, la coda usata deve essere creata in anticipo. Questa operazione può essere eseguita manualmente o tramite il codice. In questo esempio, il servizio verifica l'esistenza della coda e lo crea, se necessario. Il nome della coda viene letto dal file di configurazione.

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);
    …
}

Il servizio crea e apre un ServiceHost per OrderProcessorService, come mostrato nel seguente codice di esempio.

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();
}

Il nome della coda MSMQ viene specificato in una sezione appSettings del file di configurazione, come illustrato nella configurazione di esempio seguente.

Annotazioni

Il nome della coda usa un punto (.) per il computer locale e i separatori di barra rovesciata nel percorso. L'indirizzo dell'endpoint WCF specifica uno schema msmq.formatname e usa localhost per il computer locale. L'indirizzo della coda per ogni linee guida per l'indirizzamento del nome di formato MSMQ segue lo schema msmq.formatname.

<appSettings>
    <add key="orderQueueName" value=".\private$\Orders" />
</appSettings>

L'applicazione client è un'applicazione MSMQ che usa il Send metodo per inviare un messaggio durevole e transazionale alla coda, come illustrato nel codice di esempio seguente.

//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();

Quando si esegue l'esempio, le attività client e di servizio vengono visualizzate sia nelle finestre del servizio che della console client. È possibile visualizzare il servizio che riceve messaggi dal client. Premere INVIO in ogni finestra della console per spegnere il servizio e il client. Si noti che poiché l'accodamento è in uso, il client e il servizio non devono essere operativi contemporaneamente. Ad esempio, è possibile eseguire il client, arrestarlo e quindi avviare il servizio e ricevere comunque i messaggi.

Configurare, compilare ed eseguire l'esempio

  1. Assicurati di aver eseguito la procedura di installazione di One-Time per gli esempi di Windows Communication Foundation.

  2. Se il servizio viene eseguito per primo, verifica che la coda sia presente. Se la coda non è presente, il servizio ne creerà uno. È possibile eseguire prima il servizio per creare la coda oppure crearne una tramite Gestione code MSMQ. Seguire questa procedura per creare una coda in Windows 2008.

    1. Aprire Server Manager in Visual Studio 2012.

    2. Espandi la scheda funzionalità.

    3. Fare clic con il pulsante destro del mouse code di messaggi privati e selezionare Nuovo, coda privata.

    4. Selezionare la casella transazionale.

    5. Inserire ServiceModelSamplesTransacted come nome della nuova coda.

  3. Per compilare l'edizione C# o Visual Basic .NET della soluzione, seguire le istruzioni in Compilazione degli esempi di Windows Communication Foundation.

  4. Per eseguire l'esempio in una configurazione con computer singolo, seguire le istruzioni riportate in Esecuzione degli esempi di Windows Communication Foundation.

Eseguire il campione su diversi computer

  1. Copiare i file di programma del servizio dalla cartella \service\bin\ nella cartella specifica della lingua nel computer del servizio.

  2. Copiare i file di programma client dalla cartella \client\bin\ nella cartella specifica della lingua nel computer client.

  3. Nel file Client.exe.config modificare orderQueueName per specificare il nome del computer del servizio anziché ".".

  4. Sul computer di servizio, avvia Service.exe da un prompt dei comandi.

  5. Sul computer client, esegui Client.exe da un prompt dei comandi.

Vedere anche