Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Das MsmqToWcf-Beispiel veranschaulicht, wie eine Message Queuing (MSMQ)-Anwendung eine MSMQ-Nachricht an einen Windows Communication Foundation (WCF)-Dienst senden kann. Der Dienst ist eine selbst gehostete Konsolenanwendung, mit der Sie beobachten können, wie der Dienst Nachrichten aus der Warteschlange empfängt.
Der Dienstvertrag ist IOrderProcessor
, der einen unidirektionalen Dienst definiert, der für die Verwendung mit Warteschlangen geeignet ist. Eine MSMQ-Nachricht verfügt nicht über einen Aktionsheader, sodass es nicht möglich ist, unterschiedliche MSMQ-Nachrichten automatisch Vorgangsverträge zuzuordnen. Daher kann es nur einen Betriebsvertrag geben. Wenn Sie mehr als einen Vorgangsvertrag für den Dienst definieren möchten, muss die Anwendung Informationen darüber bereitstellen, welcher Header in der MSMQ-Nachricht (z. B. die Bezeichnung oder die Korrelations-ID) verwendet werden kann, um zu entscheiden, welcher Vorgangsvertrag ausgeführt werden soll.
Die MSMQ-Nachricht enthält keine Informationen darüber, welche Kopfzeilen den verschiedenen Parametern des Vorgangsvertrags zugeordnet sind. Der Parameter ist vom Typ MsmqMessage<T>(MsmqMessage<T>
), der die zugrunde liegende MSMQ-Nachricht enthält. Der Typ "T" in der MsmqMessage<T>(MsmqMessage<T>
) Klasse stellt die Daten dar, die in den MSMQ-Nachrichtentext serialisiert werden. In diesem Beispiel wird der PurchaseOrder
-Typ zum MSMQ-Nachrichtentext serialisiert.
Der folgende Beispielcode zeigt den Servicevertrag des Auftragsverarbeitungsdiensts.
// 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);
}
Der Dienst wird selbst gehostet. Bei Verwendung von MSMQ muss die verwendete Warteschlange im Voraus erstellt werden. Dies kann manuell oder über Code erfolgen. In diesem Beispiel sucht der Dienst nach dem Vorhandensein der Warteschlange und erstellt ihn bei Bedarf. Der Warteschlangenname wird aus der Konfigurationsdatei gelesen.
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);
…
}
Der Dienst erstellt und öffnet einen ServiceHost für den OrderProcessorService
, wie im folgenden Beispielcode dargestellt.
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();
}
Der MSMQ-Warteschlangenname wird in einem AppSettings-Abschnitt der Konfigurationsdatei angegeben, wie in der folgenden Beispielkonfiguration dargestellt.
Hinweis
Im Warteschlangennamen wird ein Punkt (.) für den lokalen Computer verwendet, und in der Pfadangabe werden umgekehrte Schrägstriche als Trennzeichen verwendet. Die WCF-Endpunktadresse gibt ein msmq.formatname-Schema an und verwendet localhost für den lokalen Computer. Die Adresse der Warteschlange für jeden MSMQ-Formatnamen, der sich auf Richtlinien bezieht, folgt dem msmq.formatname-Schema.
<appSettings>
<add key="orderQueueName" value=".\private$\Orders" />
</appSettings>
Die Clientanwendung ist eine MSMQ-Anwendung, die die Send Methode verwendet, um eine dauerhafte und transaktionsfähige Nachricht an die Warteschlange zu senden, wie im folgenden Beispielcode gezeigt.
//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();
Wenn Sie das Beispiel ausführen, werden die Client- und Dienstaktivitäten sowohl in den Dienst- als auch in den Clientkonsolenfenstern angezeigt. Sie können sehen, dass der Dienst Nachrichten vom Client empfängt. Drücken Sie die EINGABETASTE in den einzelnen Konsolenfenstern, um den Dienst und den Client zu schließen. Beachten Sie, dass aufgrund der Verwendung einer Warteschlange der Client und der Dienst nicht gleichzeitig laufen müssen. Sie könnten beispielsweise den Client ausführen, ihn herunterfahren und dann den Dienst starten, und er würde immer noch seine Nachrichten empfangen.
Einrichten, Erstellen und Ausführen des Beispiels
Stellen Sie sicher, dass Sie das One-Time Setup-Verfahren für die Windows Communication Foundation-Beispieleausgeführt haben.
Wenn der Dienst zuerst ausgeführt wird, wird überprüft, ob die Warteschlange vorhanden ist. Wenn die Warteschlange nicht vorhanden ist, erstellt der Dienst eine. Sie können den Dienst zuerst ausführen, um die Warteschlange zu erstellen, oder Sie können einen über den MSMQ-Warteschlangen-Manager erstellen. Führen Sie die folgenden Schritte aus, um eine Warteschlange in Windows 2008 zu erstellen.
Öffnen Sie den Server-Manager in Visual Studio 2012.
Erweitern Sie die Registerkarte Features.
Klicken Sie mit der rechten Maustaste auf Private Meldungswarteschlangen, und klicken Sie anschließend auf Neu und Private Warteschlange.
Aktivieren Sie das Kontrollkästchen Transaktional.
Geben Sie
ServiceModelSamplesTransacted
als Namen der neuen Warteschlange ein.
Um die C#- oder Visual Basic .NET-Edition der Lösung zu erstellen, befolgen Sie die Anweisungen in Building the Windows Communication Foundation Samples.
Wenn Sie das Beispiel in einer Einzelcomputerkonfiguration ausführen möchten, folgen Sie den Anweisungen unter Durchführen der Windows Communication Foundation-Beispiele.
Führen Sie das Beispiel auf mehreren Computern aus
Kopieren Sie die Dienstprogrammdateien aus dem Ordner \service\bin\ unter dem sprachspezifischen Ordner auf den Dienstcomputer.
Kopieren Sie die Clientprogrammdateien aus dem Ordner "\client\bin\" unter dem sprachspezifischen Ordner auf den Clientcomputer.
Ändern Sie in der datei Client.exe.config den OrderQueueName so, dass anstelle von "." der Dienstcomputername angegeben wird.
Starten Sie auf dem Dienstcomputer Service.exe an einer Eingabeaufforderung.
Starten Sie auf dem Clientcomputer Client.exe an einer Eingabeaufforderung.