Udostępnij za pośrednictwem


Obsługa kolejek komunikatów programu 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 aplikacją konsolową self-hosted, aby umożliwić obserwowanie usługi odbierających 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 ma nagłówka Akcja, więc nie można automatycznie mapować różnych komunikatów MSMQ na kontrakty 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 nagłówka w komunikacie MSMQ (na przykład etykietą lub identyfikatorem korelacji), aby zdecydować, który kontrakt operacji ma zostać wysłany.

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 element ServiceHost dla OrderProcessorServiceelementu , 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 aplikacji Ustawienia pliku konfiguracji, jak pokazano w poniższej przykładowej konfiguracji.

Uwaga

Nazwa kolejki używa kropki (.) dla komputera lokalnego i separatorów ukośnika odwrotnego w ś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ą wyświetlane zarówno w oknach konsoli usługi, jak i klienta. Usługa odbiera komunikaty od klienta. Naciśnij klawisz 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 jednorazowej 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żer serwera w programie Visual Studio 2012.

    2. Rozwiń kartę Funkcje .

    3. Kliknij prawym przyciskiem myszy pozycję Kolejki komunikatów prywatnych, a następnie wybierz pozycję 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 temacie Building the Windows Communication Foundation Samples (Tworzenie przykładów programu 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.

Uruchamianie przykładu 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 usługi uruchom Service.exe z poziomu wiersza polecenia.

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

Zobacz też