Dela via


Message Queuing till Windows Communication Foundation

MsmqToWcf-exemplet visar hur ett MSMQ-program (Message Queuing) kan skicka ett MSMQ-meddelande till en WCF-tjänst (Windows Communication Foundation). Tjänsten är ett konsolprogram med egen värd som gör att du kan observera att tjänsten tar emot köade meddelanden.

Tjänstkontraktet är IOrderProcessor, som definierar en enkelriktad tjänst som är lämplig för användning med köer. Ett MSMQ-meddelande har inget åtgärdshuvud, så det går inte att mappa olika MSMQ-meddelanden för att köra kontrakt automatiskt. Därför kan det bara finnas ett åtgärdskontrakt. Om du vill definiera fler än ett åtgärdskontrakt för tjänsten måste programmet ange information om vilket huvud i MSMQ-meddelandet (till exempel etiketten eller correlationID) som kan användas för att bestämma vilket åtgärdskontrakt som ska skickas.

MSMQ-meddelandet innehåller inte information om vilka rubriker som mappas till de olika parametrarna i åtgärdskontraktet. Parametern är av typen MsmqMessage<T>(MsmqMessage<T>), som innehåller det underliggande MSMQ-meddelandet. Typen "T" i MsmqMessage<T>klassen (MsmqMessage<T>) representerar de data som serialiseras i MSMQ-meddelandetexten. I det här exemplet PurchaseOrder serialiseras typen i MSMQ-meddelandetexten.

Följande exempelkod visar tjänstkontraktet för orderbearbetningstjänsten.

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

Tjänsten är lokalt installerad. När du använder MSMQ måste den kö som används skapas i förväg. Detta kan göras manuellt eller via kod. I det här exemplet kontrollerar tjänsten om kön finns och skapar den om det behövs. Könamnet läse från konfigurationsfilen.

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

Tjänsten skapar och öppnar en ServiceHost för OrderProcessorService, som du ser i följande exempelkod.

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

MSMQ-könamnet anges i en app Inställningar avsnitt i konfigurationsfilen, enligt följande exempelkonfiguration.

Kommentar

Könamnet använder en punkt (.) för den lokala datorn och omvänt snedstrecksavgränsare i sökvägen. WCF-slutpunktsadressen anger ett msmq.formatname-schema och använder localhost för den lokala datorn. Adressen till kön för varje MSMQ-formatnamnsadresseringsriktlinjer följer schemat msmq.formatname.

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

Klientprogrammet är ett MSMQ-program som använder Send metoden för att skicka ett varaktigt och transaktionellt meddelande till kön, enligt följande exempelkod.

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

När du kör exemplet visas klient- och tjänstaktiviteterna i både tjänst- och klientkonsolfönstren. Du kan se att tjänsten tar emot meddelanden från klienten. Tryck på RETUR i varje konsolfönster för att stänga av tjänsten och klienten. Observera att eftersom köer används behöver klienten och tjänsten inte vara igång samtidigt. Du kan till exempel köra klienten, stänga av den och sedan starta tjänsten och ändå ta emot dess meddelanden.

Konfigurera, skapa och köra exemplet

  1. Kontrollera att du har utfört engångsinstallationsproceduren för Windows Communication Foundation-exempel.

  2. Om tjänsten körs först kontrollerar den att kön finns. Om kön inte finns skapar tjänsten en. Du kan köra tjänsten först för att skapa kön, eller så kan du skapa en via MSMQ Queue Manager. Följ de här stegen för att skapa en kö i Windows 2008.

    1. Öppna Serverhanteraren i Visual Studio 2012.

    2. Expandera fliken Funktioner .

    3. Högerklicka på Privata meddelandeköer och välj Ny privat .

    4. Markera rutan Transaktionell .

    5. Ange ServiceModelSamplesTransacted som namnet på den nya kön.

  3. Om du vill skapa C# eller Visual Basic .NET-versionen av lösningen följer du anvisningarna i Skapa Windows Communication Foundation-exempel.

  4. Om du vill köra exemplet i en konfiguration med en enda dator följer du anvisningarna i Köra Windows Communication Foundation-exempel.

Kör exemplet mellan datorer

  1. Kopiera tjänstprogramfilerna från mappen \service\bin\ under den språkspecifika mappen till tjänstdatorn.

  2. Kopiera klientprogramfilerna från mappen \client\bin\ under den språkspecifika mappen till klientdatorn.

  3. I filen Client.exe.config ändrar du orderQueueName för att ange namnet på tjänstdatorn i stället för "".

  4. Starta Service.exe från en kommandotolk på tjänstdatorn.

  5. Starta Client.exe från en kommandotolk på klientdatorn.

Se även