Udostępnij za pośrednictwem


Wysyłanie komunikatów z usługi WCF do usługi kolejkowania komunikatów

Przykład WcfToMsmq pokazuje, jak aplikacja Windows Communication Foundation (WCF) może wysłać komunikat do aplikacji kolejkowania komunikatów (MSMQ). Usługa jest aplikacją konsolową self-hosted, aby umożliwić obserwowanie usługi odbierających komunikaty w kolejce. Usługa i klient nie muszą być uruchomione w tym samym czasie.

Usługa odbiera komunikaty z kolejki i przetwarza zamówienia. Usługa tworzy kolejkę transakcyjną i konfiguruje procedurę obsługi odebranych komunikatów, jak pokazano w poniższym przykładowym kodzie.

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

Po odebraniu komunikatu w kolejce program obsługi ProcessOrder komunikatów jest wywoływany.

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

}

Usługa wyodrębnia element ProcessOrder z treści komunikatu MSMQ i przetwarza zamówienie.

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

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

Uwaga

Nazwa kolejki używa kropki (.) dla komputera lokalnego i separatorów ukośnika odwrotnego w ścieżce.

Klient tworzy zamówienie zakupu i przesyła zamówienie zakupu w zakresie transakcji, jak pokazano w poniższym przykładowym kodzie.

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

Klient używa niestandardowego klienta w celu wysłania komunikatu MSMQ do kolejki. Ponieważ aplikacja, która odbiera i przetwarza komunikat, jest aplikacją MSMQ, a nie aplikacją WCF, nie ma niejawnego kontraktu usługi między dwiema aplikacjami. Dlatego nie można utworzyć serwera proxy przy użyciu narzędzia Svcutil.exe w tym scenariuszu.

Klient niestandardowy jest zasadniczo taki sam dla wszystkich aplikacji WCF, które używają powiązania do wysyłania MsmqIntegration komunikatów. W przeciwieństwie do innych klientów nie obejmuje ona szeregu operacji usługi. Jest to tylko operacja przesyłania komunikatów.

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

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.

Uwaga

Ten przykład wymaga instalacji kolejkowania komunikatów. Zapoznaj się z instrukcjami instalacji w artykule Kolejkowanie komunikatów.

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>kolejka prywatna.

    4. Zaznacz pole Transakcyjne.

    5. Wprowadź ServiceModelSamplesTransacted jako nazwę nowej kolejki.

  3. Aby skompilować wersję rozwiązania w języku C# lub Visual Basic, postępuj zgodnie z instrukcjami w temacie Kompilowanie 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ń adres punktu końcowego klienta, 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ż