Sdílet prostřednictvím


Windows Communication Foundation do služby Řízení front zpráv

Ukázka WcfToMsmq ukazuje, jak může aplikace WCF (Windows Communication Foundation) odeslat zprávu do aplikace Služby řízení front zpráv (MSMQ). 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ě. Služba a klient nemusí být spuštěny současně.

Služba přijímá zprávy z fronty a zpracovává objednávky. Systém vytvoří transakční frontu a nastavuje obslužnou rutinu pro přijaté zprávy, jak je znázorněno v následujícím ukázkovém kódu.

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

Při přijetí zprávy ve frontě je vyvolán zpracovatel ProcessOrder zprávy.

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

}

Služba extrahuje ProcessOrder z těla zprávy MSMQ a zpracuje objednávku.

Název fronty MSMQ je zadaný v části appSettings konfiguračního souboru, jak je znázorněno v následující ukázkové konfiguraci.

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

Poznámka:

Název fronty používá tečku (.) pro místní počítač a zpětná lomítka jako oddělovače ve své cestě.

Klient vytvoří nákupní objednávku a odešle nákupní objednávku v rámci transakce, jak je znázorněno v následujícím vzorovém kódu.

// 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 používá specializovaného klienta k odeslání zprávy MSMQ do fronty. Vzhledem k tomu, že aplikace, která přijímá a zpracovává zprávu, je aplikace MSMQ, a nikoli aplikace WCF, neexistuje mezi těmito dvěma aplikacemi implicitní kontrakt služby. Proto v tomto scénáři nemůžeme vytvořit proxy server pomocí nástroje Svcutil.exe.

Vlastní klient je v podstatě stejný pro všechny aplikace WCF, které používají MsmqIntegration vazbu k odesílání zpráv. Na rozdíl od jiných klientů nezahrnuje širokou škálu služebních operací. Jedná se pouze o operaci odeslání zprávy.

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

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.

Poznámka:

Tato ukázka vyžaduje instalaci služby Řízení front zpráv. Podívejte se na instrukce k instalaci ve službě Řízení front zpráv.

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

  1. Ujistěte se, že jste provedli instalační proceduru One-Time pro ukázky Windows Communication Foundation.

  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 panel Funkce.

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

    4. Zaškrtněte políčko Transakční.

    5. Jako název nové fronty zadejte ServiceModelSamplesTransacted.

  3. Pokud chcete sestavit verzi řešení v jazyce C# nebo Visual Basic, postupujte podle pokynů v tématu Sestavení ukázek Windows Communication Foundation.

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

Spusťte ukázkový příklad na více počítačích

  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 adresu koncového bodu klienta na název počítače, kde běží služba, místo ".".

  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é