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 WcfToMsmq-Beispiel veranschaulicht, wie eine Windows Communication Foundation (WCF)-Anwendung eine Nachricht an eine Message Queuing -Anwendung (MSMQ) 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 Dienst und der Client müssen nicht gleichzeitig ausgeführt werden.
Der Dienst empfängt Nachrichten aus der Warteschlange und verarbeitet Bestellungen. Der Dienst erstellt eine Transaktionswarteschlange und richtet einen Nachrichtenhandler für empfangene Nachrichten ein, wie im folgenden Beispielcode dargestellt.
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();
}
Wenn eine Nachricht in der Warteschlange empfangen wird, wird der Nachrichtenhandler ProcessOrder aufgerufen.
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);
}
}
Der Dienst extrahiert den ProcessOrder aus dem MSMQ-Nachrichtentext und verarbeitet die Bestellung.
Der MSMQ-Warteschlangenname wird in einem AppSettings-Abschnitt der Konfigurationsdatei angegeben, wie in der folgenden Beispielkonfiguration dargestellt.
<appSettings>
<add key="orderQueueName" value=".\private$\Orders" />
</appSettings>
Hinweis
Im Warteschlangennamen wird ein Punkt (.) für den lokalen Computer verwendet, und in der Pfadangabe werden umgekehrte Schrägstriche als Trennzeichen verwendet.
Der Kunde erstellt eine Bestellung und übermittelt die Bestellung im Rahmen einer Transaktion, wie im folgenden Beispielcode dargestellt.
// 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();
Der Client verwendet einen benutzerdefinierten Client, um die MSMQ-Nachricht an die Warteschlange zu senden. Da es sich bei der Anwendung, die die Nachricht empfängt und verarbeitet, um eine MSMQ-Anwendung und nicht um eine WCF-Anwendung handelt, gibt es keinen impliziten Dienstvertrag zwischen den beiden Anwendungen. Daher können wir in diesem Szenario keinen Proxy mit dem Svcutil.exe-Tool erstellen.
Der benutzerdefinierte Client ist im Wesentlichen für alle WCF-Anwendungen identisch, die die MsmqIntegration Bindung zum Senden von Nachrichten verwenden. Im Gegensatz zu anderen Clients enthält dieser keinen Bereich von Dienstvorgängen. Es handelt sich nur um einen Nachrichtensendevorgang.
[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);
}
}
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 in jedem Konsolenfenster die EINGABETASTE, um den Dienst und den Client zu beenden. 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.
Hinweis
Für dieses Beispiel ist die Installation von Message Queuing erforderlich. Lesen Sie die Installationsanweisungen in Message Queuing.
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 Nachrichtenwarteschlangen, und wählen Sie dann "Neue>private Warteschlange" aus.
Aktivieren Sie das Kontrollkästchen Transaktional.
Geben Sie
ServiceModelSamplesTransactedals Namen der neuen Warteschlange ein.
Um die C#- oder Visual Basic-Edition der Lösung zu erstellen, befolgen Sie die Anweisungen in Building the Windows Communication Foundation Samples.
Um das Beispiel in einer Einzelrechnerkonfiguration auszuführen, folgen Sie den Anweisungen unter Ausfü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 die Clientendpunktadresse, um den Namen des Dienstcomputers anstelle von "." anzugeben.
Starten Sie auf dem Dienstcomputer Service.exe an einer Eingabeaufforderung.
Starten Sie auf dem Clientcomputer Client.exe an einer Eingabeaufforderung.