Windows Communication Foundation zu Message QueuingWindows Communication Foundation to Message Queuing

In diesem Beispiel wird veranschaulicht, wie eine Windows Communication Foundation (WCF)Windows Communication Foundation (WCF)-Anwendung eine Nachricht an eine MSMQ-Anwendung (Message Queuing) senden kann.This sample demonstrates how a Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) application can send a message to a Message Queuing (MSMQ) application. Der Dienst ist eine selbst gehostete Konsolenanwendung, die es Ihnen ermöglicht, den Dienst beim Empfang von Nachrichten in der Warteschlange zu beobachten.The service is a self-hosted console application to enable you to observe the service receiving queued messages. Der Dienst und der Client müssen dazu nicht gleichzeitig ausgeführt werden.The service and client do not have to be running at the same time.

Der Dienst empfängt Nachrichten von der Warteschlange und verarbeitet Bestellungen.The service receives messages from the queue and processes orders. Der Dienst erstellt eine Transaktionswarteschlage und richtet einen "Nachricht empfangen"-Nachrichtenhandler ein, wie im folgenden Beispielcode gezeigt.The service creates a transactional queue and sets up a message received message handler, as shown in the following sample code.

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 die Nachricht in der Warteschlange empfangen wird, wird der Nachrichtenhandler ProcessOrder aufgerufen.When a message is received in the queue, the message handler ProcessOrder is invoked.

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 die ProcessOrder aus dem MSMQ-Nachrichtentext heraus und verarbeitet die Bestellung.The service extracts the ProcessOrder from the MSMQ message body, and processes the order.

Der Name der MSMQ-Warteschlange wird im appSettings-Abschnitt der Konfigurationsdatei angegeben, wie in der folgenden Beispielkonfiguration gezeigt.The MSMQ queue name is specified in an appSettings section of the configuration file, as shown in the following sample configuration.

<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.The queue name uses a dot (.) for the local computer and backslash separators in its path.

Der Client erstellt eine Bestellung und reicht die Bestellung im Geltungsbereich der Transaktion ein, wie im folgenden Beispielcode gezeigt.The client creates a purchase order and submits the purchase order within the scope of a transaction, as shown in the following sample code.

// 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 zum Senden der MSMQ-Nachricht an die Warteschlange.The client uses a custom client in-order to send the MSMQ message to the queue. Da die Anwendung, die die Nachricht empfängt und verarbeitet, keine WCFWCF- sondern eine MSMQ-Anwendung ist, besteht zwischen den beiden Anwendungen kein implizierter Dienstvertrag.Because the application that receives and processes the message is an MSMQ application and not a WCFWCF application, there is no implicit service contract between the two applications. Deshalb kann in diesem Szenario kein Proxy mit dem Tool "Svcutil.exe" erstellt werden.So, we cannot create a proxy using the Svcutil.exe tool in this scenario.

Der benutzerdefinierte Client ist im Wesentlichen bei allen WCFWCF-Anwendungen gleich, die die MsmqIntegration-Bindung zum Senden von Nachrichten verwenden.The custom client is essentially the same for all WCFWCF applications that use the MsmqIntegration binding to send messages. Im Gegensatz zu anderen Clients enthält dieser keinen Bereich von Dienstvorgängen.Unlike other clients, it does not include a range of service operations. Es ist nur ein Sende-Nachricht-Vorgang.It is a submit message operation only.

[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 im Dienst- als auch im Clientkonsolenfenster angezeigt.When you run the sample, the client and service activities are displayed in both the service and client console windows. Sie können sehen, wie der Dienst Nachrichten vom Client empfängt.You can see the service receive messages from the client. Drücken Sie die EINGABETASTE in den einzelnen Konsolenfenstern, um den Dienst und den Client zu schließen.Press ENTER in each console window to shut down the service and client. Beachten Sie, dass aufgrund der Verwendung einer Warteschlange der Client und der Dienst nicht gleichzeitig ausgeführt werden müssen.Note that because queuing is in use, the client and service do not have to be up and running at the same time. Sie können beispielsweise den Client ausführen, ihn schließen und anschließend den Dienst starten, der dann trotzdem noch die Nachrichten des Clients empfängt.For example, you could run the client, shut it down, and then start up the service and it would still receive its messages.

Hinweis

Dieses Beispiel erfordert die Installation von Message Queuing.This sample requires the installation of Message Queuing. Finden Sie unter den installationsanweisungen im Message Queuing.See the installation instructions in Message Queuing.

So richten Sie das Beispiel ein, erstellen es und führen es ausTo setup, build, and run the sample

  1. Stellen Sie sicher, dass Sie ausgeführt haben die Setupprozedur für die Windows Communication Foundation-Beispiele zum einmaligen.Ensure that you have performed the One-Time Setup Procedure for the Windows Communication Foundation Samples.

  2. Wenn der Dienst zuerst ausgeführt wird, wird überprüft, ob die Warteschlange vorhanden ist.If the service is run first, it will check to ensure that the queue is present. Ist die Warteschlange nicht vorhanden, wird sie vom Dienst erstellt.If the queue is not present, the service will create one. Sie können zuerst den Dienst ausführen, um die Warteschlange zu erstellen, oder Sie können sie über den MSMQ-Warteschlangen-Manager erstellen.You can run the service first to create the queue, or you can create one via the MSMQ Queue Manager. Führen Sie zum Erstellen einer Warteschlange in Windows 2008 die folgenden Schritte aus:Follow these steps to create a queue in Windows 2008.

    1. Öffnen Sie Server-Manager in Visual Studio 2012Visual Studio 2012.Open Server Manager in Visual Studio 2012Visual Studio 2012.

    2. Erweitern Sie die Funktionen Registerkarte.Expand the Features tab.

    3. Mit der rechten Maustaste Private Meldungswarteschlangen, und wählen Sie neu, Private Warteschlange.Right-click Private Message Queues, and select New, Private Queue.

    4. Überprüfen Sie die transaktional Feld.Check the Transactional box.

    5. Geben Sie ServiceModelSamplesTransacted als Namen für die neue Warteschlange.Enter ServiceModelSamplesTransacted as the name of the new queue.

  3. Um die C#- oder Visual Basic .NET-Edition der Projektmappe zu erstellen, befolgen Sie die unter Building the Windows Communication Foundation Samplesaufgeführten Anweisungen.To build the C# or Visual Basic .NET edition of the solution, follow the instructions in Building the Windows Communication Foundation Samples.

  4. Führen Sie zum Ausführen des Beispiels in einer einzelnen Computerkonfiguration die Anweisungen im Ausführen der Windows Communication Foundation-Beispiele.To run the sample in a single-computer configuration, follow the instructions in Running the Windows Communication Foundation Samples.

So führen Sie das Beispiel computerübergreifend ausTo run the sample across computers

  1. Kopieren Sie die Dienstprogrammdateien aus dem Ordner \service\bin\ (unterhalb des sprachspezifischen Ordners) auf den Dienstcomputer.Copy the service program files from the \service\bin\ folder, under the language-specific folder, to the service computer.

  2. Kopieren Sie die Clientprogrammdateien aus dem Ordner \client\bin\ (unterhalb des sprachspezifischen Ordners) auf den Clientcomputer.Copy the client program files from the \client\bin\ folder, under the language-specific folder, to the client computer.

  3. Ändern Sie in der Datei Client.exe.config die Clientendpunktadresse, und geben Sie anstelle von "." den Namen des Dienstcomputers an.In the Client.exe.config file, change the client endpoint address to specify the service computer name instead of ".".

  4. Starten Sie auf dem Dienstcomputer Service.exe an einer Eingabeaufforderung.On the service computer, launch Service.exe from a command prompt.

  5. Starten Sie auf dem Clientcomputer Client.exe an einer Eingabeaufforderung.On the client computer, launch Client.exe from a command prompt.

Wichtig

Die Beispiele sind möglicherweise bereits auf dem Computer installiert.The samples may already be installed on your computer. Suchen Sie nach dem folgenden Verzeichnis (Standardverzeichnis), bevor Sie fortfahren.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Wenn dieses Verzeichnis nicht vorhanden ist, rufen Sie Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 auf, um alle Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) - und WFWF -Beispiele herunterzuladen.If this directory does not exist, go to Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 to download all Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) and WFWF samples. Dieses Beispiel befindet sich im folgenden Verzeichnis.This sample is located in the following directory.

<InstallDrive>:\WF_WCF_Samples\WCF\Basic\Binding\MSMQIntegration\WcfToMsmq

Siehe auchSee Also

Vorgehensweise: Nachrichtenaustausch mit WCF-Endpunkten und Message Queuing-AnwendungenHow to: Exchange Messages with WCF Endpoints and Message Queuing Applications
Message QueuingMessage Queuing