Udostępnij za pośrednictwem


Kolejkowanie komunikatów w Windows Communication Foundation

Przykład MsmqToWcf pokazuje, w jaki sposób aplikacja msmq (Message Queuing) może wysyłać komunikat MSMQ do usługi Windows Communication Foundation (WCF). Usługa jest samodzielnie hostowaną aplikacją konsolową, która umożliwia obserwowanie, jak usługa odbiera komunikaty w kolejce.

Kontrakt usługi to IOrderProcessor, który definiuje jednokierunkową usługę, która jest odpowiednia do użycia z kolejkami. Komunikat MSMQ nie posiada nagłówka Akcji, więc nie można automatycznie przypisywać różnych wiadomości MSMQ do kontraktów operacji. W związku z tym może istnieć tylko jeden kontrakt operacji. Jeśli chcesz zdefiniować więcej niż jeden kontrakt operacji dla usługi, aplikacja musi podać informacje dotyczące tego, który nagłówek w komunikacie MSMQ (na przykład etykieta lub identyfikator korelacji) może zostać użyty, aby zdecydować, który kontrakt operacji powinien zostać wykonany.

Komunikat MSMQ nie zawiera informacji o tym, które nagłówki są mapowane na różne parametry kontraktu operacji. Parametr jest typu MsmqMessage<T>(MsmqMessage<T>), który zawiera podstawowy komunikat MSMQ. Typ "T" w MsmqMessage<T>klasie (MsmqMessage<T>) reprezentuje dane serializowane w treści komunikatu MSMQ. W tym przykładzie PurchaseOrder typ jest serializowany do treści komunikatu MSMQ.

Poniższy przykładowy kod przedstawia kontrakt usługi przetwarzania zamówień.

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

Usługa jest hostowana samodzielnie. W przypadku korzystania z usługi MSMQ używana kolejka musi zostać utworzona z wyprzedzeniem. Można to zrobić ręcznie lub za pomocą kodu. W tym przykładzie usługa sprawdza istnienie kolejki i tworzy ją w razie potrzeby. Nazwa kolejki jest odczytywana z pliku konfiguracji.

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

Usługa tworzy i otwiera ServiceHost dla OrderProcessorService, jak pokazano w poniższym przykładowym kodzie.

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

Nazwa kolejki MSMQ jest określona w sekcji appSettings pliku konfiguracji, jak pokazano w poniższej przykładowej konfiguracji.

Uwaga / Notatka

Nazwa kolejki używa kropki (.) dla komputera lokalnego i ukośników odwrotnych w swojej ścieżce. Adres punktu końcowego programu WCF określa schemat msmq.formatname i używa hosta lokalnego dla komputera lokalnego. Adres kolejki dla każdego adresu nazwy formatu MSMQ jest zgodny ze schematem msmq.formatname.

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

Aplikacja kliencka to aplikacja MSMQ, która używa Send metody do wysyłania trwałego i transakcyjnego komunikatu do kolejki, jak pokazano w poniższym przykładowym kodzie.

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

Po uruchomieniu przykładu, działania klienta i usługi są zaprezentowane zarówno w oknach konsoli usługi, jak i klienta. Możesz zobaczyć, jak usługa odbiera komunikaty od klienta. Naciśnij ENTER w każdym oknie konsoli, aby zamknąć usługę i klienta. Należy pamiętać, że ponieważ kolejkowanie jest używane, klient i usługa nie muszą być uruchomione w tym samym czasie. Można na przykład uruchomić klienta, zamknąć go, a następnie uruchomić usługę i nadal odbierać komunikaty.

Konfigurowanie, kompilowanie i uruchamianie przykładu

  1. Upewnij się, że wykonano procedurę instalacji One-Time dla przykładów programu Windows Communication Foundation.

  2. Jeśli usługa jest uruchomiona jako pierwsza, sprawdzi, czy kolejka jest obecna. Jeśli kolejka nie jest obecna, usługa utworzy je. Możesz najpierw uruchomić usługę, aby utworzyć kolejkę, lub utworzyć jedną za pośrednictwem menedżera kolejki MSMQ. Wykonaj następujące kroki, aby utworzyć kolejkę w systemie Windows 2008.

    1. Otwórz Menedżera serwera w programie Visual Studio 2012.

    2. Rozwiń kartę Funkcje .

    3. Kliknij prawym przyciskiem myszy Prywatne Kolejki Wiadomościi wybierz Nowa, Prywatna Kolejka.

    4. Zaznacz pole Transakcyjne.

    5. Wprowadź ServiceModelSamplesTransacted jako nazwę nowej kolejki.

  3. Aby skompilować wersję rozwiązania w języku C# lub Visual Basic .NET, postępuj zgodnie z instrukcjami w Kompilowanie przykładów Windows Communication Foundation.

  4. Aby uruchomić przykład w konfiguracji pojedynczego komputera, postępuj zgodnie z instrukcjami w temacie Uruchamianie przykładów programu Windows Communication Foundation.

Uruchom przykład na komputerach

  1. Skopiuj pliki programu usługi z folderu \service\bin\ w folderze specyficznym dla języka na komputer usługi.

  2. Skopiuj pliki programu klienckiego z folderu \client\bin\ w folderze specyficznym dla języka na komputer kliencki.

  3. W pliku Client.exe.config zmień nazwę orderQueueName, aby określić nazwę komputera usługi zamiast ".".

  4. Na komputerze serwisowym uruchom Service.exe z poziomu wiersza polecenia.

  5. Na komputerze klienckim uruchom Client.exe z poziomu wiersza polecenia.

Zobacz także