Message Queuing naar Windows Communication Foundation
Het MsmqToWcf-voorbeeld laat zien hoe een Message Queuing-toepassing (MSMQ) een MSMQ-bericht kan verzenden naar een WCF-service (Windows Communication Foundation). De service is een zelf-hostende consoletoepassing waarmee u de service die berichten in de wachtrij ontvangt, kunt observeren.
Het servicecontract is IOrderProcessor
, waarmee een eenrichtingsservice wordt gedefinieerd die geschikt is voor gebruik met wachtrijen. Een MSMQ-bericht heeft geen actieheader, dus het is niet mogelijk om verschillende MSMQ-berichten automatisch toe te wijzen aan bewerkingscontracten. Daarom kan er slechts één bewerkingscontract zijn. Als u meer dan één bewerkingscontract voor de service wilt definiëren, moet de toepassing informatie opgeven over welke header in het MSMQ-bericht (bijvoorbeeld het label of de correlationID) kan worden gebruikt om te bepalen welk bewerkingscontract moet worden verzonden.
Het MSMQ-bericht bevat geen informatie over welke headers worden toegewezen aan de verschillende parameters van het bewerkingscontract. De parameter is van het type MsmqMessage<T>(MsmqMessage<T>
), dat het onderliggende MSMQ-bericht bevat. Het type 'T' in de MsmqMessage<T>(MsmqMessage<T>
)-klasse vertegenwoordigt de gegevens die in de hoofdtekst van het MSMQ-bericht worden geserialiseerd. In dit voorbeeld wordt het PurchaseOrder
type geserialiseerd in de hoofdtekst van het MSMQ-bericht.
De volgende voorbeeldcode toont het servicecontract van de orderverwerkingsservice.
// 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);
}
De service wordt zelf gehost. Wanneer u MSMQ gebruikt, moet de gebruikte wachtrij vooraf worden gemaakt. Dit kan handmatig of via code. In dit voorbeeld controleert de service op het bestaan van de wachtrij en maakt deze indien nodig. De naam van de wachtrij wordt gelezen uit het configuratiebestand.
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);
…
}
De service maakt en opent een ServiceHost voor de OrderProcessorService
, zoals wordt weergegeven in de volgende voorbeeldcode.
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();
}
De naam van de MSMQ-wachtrij wordt opgegeven in een app Instellingen sectie van het configuratiebestand, zoals wordt weergegeven in de volgende voorbeeldconfiguratie.
Notitie
De wachtrijnaam maakt gebruik van een punt (.) voor de lokale computer en backslash-scheidingstekens in het pad. Het WCF-eindpuntadres geeft een msmq.formatname-schema op en gebruikt localhost voor de lokale computer. Het adres van de wachtrij voor elke msMQ format name adresseringsrichtlijnen volgt het schema msmq.formatname.
<appSettings>
<add key="orderQueueName" value=".\private$\Orders" />
</appSettings>
De clienttoepassing is een MSMQ-toepassing die gebruikmaakt van de methode voor het Send verzenden van een duurzaam en transactioneel bericht naar de wachtrij, zoals wordt weergegeven in de volgende voorbeeldcode.
//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();
Wanneer u het voorbeeld uitvoert, worden de client- en serviceactiviteiten weergegeven in zowel de service- als clientconsolevensters. U ziet dat de service berichten van de client ontvangt. Druk in elk consolevenster op Enter om de service en client af te sluiten. Houd er rekening mee dat omdat wachtrijen in gebruik zijn, de client en service niet tegelijkertijd actief hoeven te zijn. U kunt bijvoorbeeld de client uitvoeren, de client afsluiten en vervolgens de service starten en de berichten nog steeds ontvangen.
Het voorbeeld instellen, bouwen en uitvoeren
Zorg ervoor dat u de eenmalige installatieprocedure voor de Windows Communication Foundation-voorbeelden hebt uitgevoerd.
Als de service eerst wordt uitgevoerd, wordt gecontroleerd of de wachtrij aanwezig is. Als de wachtrij niet aanwezig is, maakt de service er een. U kunt de service eerst uitvoeren om de wachtrij te maken of u kunt er een maken via MSMQ Queue Manager. Volg deze stappen om een wachtrij te maken in Windows 2008.
Open Serverbeheer in Visual Studio 2012.
Vouw het tabblad Functies uit.
Klik met de rechtermuisknop op Persoonlijke berichtenwachtrijen en selecteer Nieuwe, Privéwachtrij.
Schakel het selectievakje Transactioneel in.
Voer de
ServiceModelSamplesTransacted
naam in van de nieuwe wachtrij.
Als u de C# of Visual Basic .NET-editie van de oplossing wilt bouwen, volgt u de instructies in het bouwen van de Windows Communication Foundation-voorbeelden.
Als u het voorbeeld wilt uitvoeren in een configuratie met één computer, volgt u de instructies in Het uitvoeren van de Windows Communication Foundation-voorbeelden.
Het voorbeeld uitvoeren op computers
Kopieer de serviceprogrammabestanden uit de map \service\bin\ onder de taalspecifieke map naar de servicecomputer.
Kopieer de clientprogrammabestanden uit de map \client\bin\ onder de taalspecifieke map naar de clientcomputer.
Wijzig in het bestand Client.exe.config de orderQueueName om de naam van de servicecomputer op te geven in plaats van '.'.
Start Service.exe vanaf een opdrachtprompt op de servicecomputer.
Start Client.exe vanaf een opdrachtprompt op de clientcomputer.