Condividi tramite


Windows Communication Foundation per Accodamento Messaggi

L'esempio WcfToMsmq illustra come un'applicazione Windows Communication Foundation (WCF) può inviare un messaggio a un'applicazione msmq (Message Queuing). Il servizio è un'applicazione console autogestita che permette di osservare la ricezione di messaggi in coda da parte del servizio. Il servizio e il client non devono essere in esecuzione contemporaneamente.

Il servizio riceve messaggi dalla coda ed elabora gli ordini. Il servizio crea una coda transazionale e configura un gestore di messaggi ricevuti, come illustrato nel codice di esempio seguente.

static void Main(string[] args)
{
    if (!MessageQueue.Exists(
              ConfigurationManager.AppSettings["queueName"]))
       MessageQueue.Create(
           ConfigurationManager.AppSettings["queueName"], true);
        //Connect to the queue
        MessageQueue Queue = new
    MessageQueue(ConfigurationManager.AppSettings["queueName"]);
    Queue.ReceiveCompleted +=
                 new ReceiveCompletedEventHandler(ProcessOrder);
    Queue.BeginReceive();
    Console.WriteLine("Order Service is running");
    Console.ReadLine();
}

Quando viene ricevuto un messaggio nella coda, il gestore messaggi ProcessOrder viene richiamato.

public static void ProcessOrder(Object source,
    ReceiveCompletedEventArgs asyncResult)
{
    try
    {
        // Connect to the queue.
        MessageQueue Queue = (MessageQueue)source;
        // End the asynchronous receive operation.
        System.Messaging.Message msg =
                     Queue.EndReceive(asyncResult.AsyncResult);
        msg.Formatter = new System.Messaging.XmlMessageFormatter(
                                new Type[] { typeof(PurchaseOrder) });
        PurchaseOrder po = (PurchaseOrder) msg.Body;
        Random statusIndexer = new Random();
        po.Status = PurchaseOrder.OrderStates[statusIndexer.Next(3)];
        Console.WriteLine("Processing {0} ", po);
        Queue.BeginReceive();
    }
    catch (System.Exception ex)
    {
        Console.WriteLine(ex.Message);
    }

}

Il servizio estrae il corpo del messaggio MSMQ dal ProcessOrder, ed elabora l'ordine.

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

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

Annotazioni

Il nome della coda usa un punto (.) per il computer locale e i separatori di barra rovesciata nel percorso.

Il client crea un ordine di acquisto e invia l'ordine di acquisto nell'ambito di una transazione, come illustrato nel codice di esempio seguente.

// Create the purchase order
PurchaseOrder po = new PurchaseOrder();
// Fill in the details
...

OrderProcessorClient client = new OrderProcessorClient("OrderResponseEndpoint");

MsmqMessage<PurchaseOrder> ordermsg = new MsmqMessage<PurchaseOrder>(po);
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
    client.SubmitPurchaseOrder(ordermsg);
    scope.Complete();
}
Console.WriteLine("Order has been submitted:{0}", po);

//Closing the client gracefully closes the connection and cleans up resources
client.Close();

Il client usa un client personalizzato per inviare il messaggio MSMQ alla coda. Poiché l'applicazione che riceve ed elabora il messaggio è un'applicazione MSMQ e non un'applicazione WCF, non esiste alcun contratto di servizio implicito tra le due applicazioni. Pertanto, non è possibile creare un proxy usando lo strumento Svcutil.exe in questo scenario.

Il client personalizzato è essenzialmente lo stesso per tutte le applicazioni WCF che usano l'associazione MsmqIntegration per inviare messaggi. A differenza di altri clienti, non include una gamma di operazioni di servizio. Si tratta solo di un'operazione di invio del messaggio.

[System.ServiceModel.ServiceContractAttribute(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface IOrderProcessor
{
    [OperationContract(IsOneWay = true, Action = "*")]
    void SubmitPurchaseOrder(MsmqMessage<PurchaseOrder> msg);
}

public partial class OrderProcessorClient : System.ServiceModel.ClientBase<IOrderProcessor>, IOrderProcessor
{
    public OrderProcessorClient(){}

    public OrderProcessorClient(string configurationName)
        : base(configurationName)
    { }

    public OrderProcessorClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress address)
        : base(binding, address)
    { }

    public void SubmitPurchaseOrder(MsmqMessage<PurchaseOrder> msg)
    {
        base.Channel.SubmitPurchaseOrder(msg);
    }
}

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.

Annotazioni

Questo Esempio richiede l'installazione di Microsoft Message Queue. Consultare le istruzioni di installazione in Accodamento 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 su Code di messaggi privati e quindi scegliere Nuova>coda privata.

    4. Selezionare la casella transazionale.

    5. Inserire ServiceModelSamplesTransacted come nome della nuova coda.

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

  4. Per eseguire l'esempio in una configurazione a 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 l'indirizzo dell'endpoint client 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