Sdílet prostřednictvím


Řízení front zpráv do WCF

Ukázka MsmqToWcf ukazuje, jak může aplikace služby Řízení front zpráv (MSMQ) odeslat zprávu MSMQ službě Windows Communication Foundation (WCF). Služba je konzolová aplikace v místním prostředí, která umožňuje sledovat službu, která přijímá zprávy ve frontě.

Kontrakt služby je IOrderProcessor, který definuje jednosměrnou službu, která je vhodná pro použití s frontami. Zpráva MSMQ nemá záhlaví akce, takže není možné mapovat různé zprávy MSMQ na operace kontrakty automaticky. Proto může existovat pouze jeden kontrakt operace. Pokud chcete pro službu definovat více než jeden kontrakt operace, musí aplikace zadat informace o tom, jaká hlavička ve zprávě MSMQ (například popisek nebo ID korelace) se dá použít k rozhodnutí, který kontrakt operace se má odeslat.

Zpráva MSMQ neobsahuje informace o tom, na které hlavičky jsou mapovány na různé parametry kontraktu operace. Parametr je typu MsmqMessage<T>(MsmqMessage<T>), který obsahuje podkladovou zprávu MSMQ. Typ "T" ve MsmqMessage<T>třídě (MsmqMessage<T>) představuje data, která jsou serializována do textu zprávy MSMQ. V této ukázce PurchaseOrder je typ serializován do textu zprávy MSMQ.

Následující ukázkový kód ukazuje servisní kontrakt služby zpracování objednávek.

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

Služba je hostovaná v místním prostředí. Při použití MSMQ je nutné předem vytvořit použitou frontu. Můžete to provést ručně nebo prostřednictvím kódu. V této ukázce služba zkontroluje existenci fronty a v případě potřeby ji vytvoří. Název fronty se načte z konfiguračního souboru.

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

Služba vytvoří a otevře ServiceHost pro objekt OrderProcessorService, jak je znázorněno v následujícím vzorovém kódu.

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

Název fronty MSMQ se zadává v aplikaci Nastavení části konfiguračního souboru, jak je znázorněno v následující ukázkové konfiguraci.

Poznámka:

Název fronty používá tečku (.) pro místní počítač a oddělovače zpětného lomítka v jeho cestě. Adresa koncového bodu WCF určuje schéma msmq.formatname a používá pro místní počítač localhost. Adresa fronty pro každý název formátu MSMQ se řídí schématem msmq.formatname.

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

Klientská aplikace je aplikace MSMQ, která používá metodu Send k odeslání trvalé a transakční zprávy do fronty, jak je znázorněno v následujícím vzorovém kódu.

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

Při spuštění ukázky se aktivity klienta a služeb zobrazí v oknech služby i konzoly klienta. Můžete vidět, že služba přijímá zprávy od klienta. Stisknutím klávesy ENTER v každém okně konzoly vypnete službu a klienta. Všimněte si, že vzhledem k tomu, že se používá řízení front, nemusí být klient a služba ve stejnou dobu spuštěné. Můžete například spustit klienta, vypnout ho a pak spustit službu a stále by přijímala zprávy.

Nastavení, sestavení a spuštění ukázky

  1. Ujistěte se, že jste pro ukázky windows Communication Foundation provedli jednorázovou instalační proceduru.

  2. Pokud je služba spuštěná jako první, zkontroluje, jestli je fronta k dispozici. Pokud fronta není k dispozici, služba ji vytvoří. Službu můžete nejprve spustit, abyste vytvořili frontu, nebo ji můžete vytvořit prostřednictvím Správce front MSMQ. Podle těchto kroků vytvořte frontu v systému Windows 2008.

    1. Otevřete Správce serveru v sadě Visual Studio 2012.

    2. Rozbalte kartu Funkce.

    3. Klikněte pravým tlačítkem myši na Soukromé fronty zpráv a vyberte Nová soukromá fronta.

    4. Zaškrtněte políčko Transactional (Transakce).

    5. Zadejte ServiceModelSamplesTransacted jako název nové fronty.

  3. Pokud chcete sestavit edici C# nebo Visual Basic .NET řešení, postupujte podle pokynů v části Sestavení ukázek windows Communication Foundation.

  4. Pokud chcete spustit ukázku v konfiguraci s jedním počítačem, postupujte podle pokynů v části Spuštění ukázek windows Communication Foundation.

Spuštění ukázky napříč počítači

  1. Zkopírujte soubory programu služby ze složky \service\bin\ ve složce specifické pro jazyk do počítače služby.

  2. Zkopírujte soubory klientského programu ze složky \client\bin\ ve složce specifické pro jazyk do klientského počítače.

  3. V souboru Client.exe.config změňte název orderQueueName tak, aby místo "."zadal název počítače služby.

  4. Na počítači služby spusťte Service.exe z příkazového řádku.

  5. Na klientském počítači spusťte Client.exe z příkazového řádku.

Viz také