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

Sie können vorhandene Message Queuing (MSMQ)- Anwendungen mit Windows Communication Foundation (WCF)Windows Communication Foundation (WCF)-Anwendungen integrieren, indem Sie mithilfe der Bindung für die MSMQ-Integration MSMQ-Nachrichten in WCFWCF-Nachrichten und WCF-Nachrichten in MSMQ-Nachrichten konvertieren.You can integrate existing Message Queuing (MSMQ) applications with Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) applications by using the MSMQ integration binding to convert MSMQ messages to and from WCFWCF messages. So können Sie mit WCFWCF-Clients MSMQ-Empfängeranwendungen und mit MSMQ-Sendeanwendungen WCFWCF-Dienste aufrufen.This allows you to call into MSMQ receiver applications from WCFWCF clients as well as call into WCFWCF services from MSMQ sender applications.

In diesem Abschnitt wird erläutert, wie Sie MsmqIntegrationBinding für die Warteschlangenkommunikation zwischen (1) einem WCFWCF-Client und einem mit System.Messaging geschriebenen MSMQ-Anwendungsdienst und (2) einem MSMQ-Anwendungsclient und einem WCFWCF-Dienst verwenden können.In this section, we explain how to use MsmqIntegrationBinding for queued communication between (1) a WCFWCF client and an MSMQ application service written using System.Messaging and (2) an MSMQ application client and a WCFWCF service.

Ein vollständiges Beispiel, das veranschaulicht, wie eine MSMQ-empfängeranwendung aus Aufrufen einer WCFWCF Client finden Sie unter der Windows Communication Foundation zu Message Queuing Beispiel.For a complete sample that demonstrates how to call a MSMQ receiver application from a WCFWCF client, see the Windows Communication Foundation to Message Queuing sample.

Ein vollständiges Beispiel, das veranschaulicht, wie eine WCFWCF -Dienst von einem MSMQ-Client, finden Sie unter der Message Queuing zu Windows Communication Foundation Beispiel.For a complete sample that demonstrates how to call a WCFWCF service from a MSMQ client, see the Message Queuing to Windows Communication Foundation sample.

So erstellen Sie einen WCF-Dienst, der Nachrichten von einem MSMQ-Client empfängtTo create a WCF service that receives messages from a MSMQ client

  1. Definieren Sie wie im folgenden Beispielcode gezeigt eine Schnittstelle, die den Dienstvertrag für den WCFWCF-Dienst definiert, der die über eine Warteschlange geleiteten Nachrichten einer MSMQ-Sendeanwendung empfängt:Define an interface that defines the service contract for the WCFWCF service that receives queued messages from a MSMQ sender application, as shown in the following example code.

    [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
    [ServiceKnownType(typeof(PurchaseOrder))]
    public interface IOrderProcessor
    {
        [OperationContract(IsOneWay = true, Action = "*")]
        void SubmitPurchaseOrder(MsmqMessage<PurchaseOrder> msg);
    }
    
    <ServiceContract(Namespace:="http:'Microsoft.ServiceModel.Samples")> _
    <ServiceKnownType(GetType(PurchaseOrder))> _
    Public Interface IOrderProcessor
        <OperationContract(IsOneWay:=True, Action:="*")> _
        Sub SubmitPurchaseOrder(ByVal msg As MsmqMessage(Of PurchaseOrder))
    End Interface
    
  2. Implementieren Sie die Schnittstelle, und wenden Sie das ServiceBehaviorAttribute-Attribut wie im folgenden Beispielcode gezeigt auf die Klasse an.Implement the interface and apply the ServiceBehaviorAttribute attribute to the class, as shown in the following example code.

       public class OrderProcessorService : IOrderProcessor
       {
           [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
           public void SubmitPurchaseOrder(MsmqMessage<PurchaseOrder> ordermsg)
           {
               PurchaseOrder po = (PurchaseOrder)ordermsg.Body;
               Random statusIndexer = new Random();
               po.Status = (OrderStates)statusIndexer.Next(3);
               Console.WriteLine("Processing {0} ", po);
           }
    
        // Host the service within this EXE console application.
    public static void Main()
    {
        // Get base address from appsettings in configuration.
    	Uri baseAddress = new Uri(ConfigurationManager.AppSettings["baseAddress"]);
    
        // Create a ServiceHost for the CalculatorService type and provide the base address.
    	using (ServiceHost serviceHost = new ServiceHost(typeof(IOrderProcessor), baseAddress))
    	{
    	// Open the ServiceHostBase to create listeners and start listening for messages.
    		serviceHost.Open();
    
    	// The service can now be accessed.
    		Console.WriteLine("The service is ready.");
    		Console.WriteLine("The service is running in the following account: {0}", WindowsIdentity.GetCurrent().Name);
    		Console.WriteLine("Press <ENTER> to terminate service.");
    		Console.WriteLine();
    		Console.ReadLine();
    
    	// Close the ServiceHostBase to shutdown the service.
    		serviceHost.Close();
    	}
    }
    
       }
    
    Public Class OrderProcessorService
        Implements IOrderProcessor
    
        <OperationBehavior(TransactionScopeRequired:=True, TransactionAutoComplete:=True)> _
        Public Sub SubmitPurchaseOrder(ByVal ordermsg As MsmqMessage(Of PurchaseOrder)) Implements IOrderProcessor.SubmitPurchaseOrder
            Dim po As PurchaseOrder = ordermsg.Body
            Dim statusIndexer As New Random()
            po.Status = statusIndexer.Next(3)
            Console.WriteLine("Processing {0} ", po)
        End Sub
    End Class
    
  3. Erstellen Sie eine Konfigurationsdatei, die die MsmqIntegrationBinding angibt.Create a configuration file that specifies the MsmqIntegrationBinding.

  4. Instanziieren Sie ein ServiceHost-Objekt, das die konfigurierte Bindung verwendet.Instantiate a ServiceHost object that uses the configured binding.

So erstellen Sie einen WCF-Client, der Nachrichten an eine MSMQ-Empfängeranwendung sendetTo create a WCF client that sends messages to a MSMQ receiver application

  1. Definieren Sie wie im folgenden Beispielcode gezeigt eine Schnittstelle, die den Dienstvertrag für den WCFWCF-Client definiert, der über eine Warteschlange geleitete Nachrichten an den MSMQ-Empfänger sendet:Define an interface that defines the service contract for the WCFWCF client that sends queued messages to the MSMQ receiver, as shown in the following example code.

    [System.ServiceModel.ServiceContractAttribute(Namespace = "http://Microsoft.ServiceModel.Samples")]
    public interface IOrderProcessor
    {
        [OperationContract(IsOneWay = true, Action = "*")]
        void SubmitPurchaseOrder(MsmqMessage<PurchaseOrder> msg);
    }
    
    public interface IOrderProcessorChannel : IOrderProcessor, System.ServiceModel.IClientChannel
    {
    }
    
    <System.ServiceModel.ServiceContractAttribute(Namespace:="http:'Microsoft.ServiceModel.Samples")> _
    Public Interface IOrderProcessor
        <OperationContract(IsOneWay:=True, Action:="*")> _
        Sub SubmitPurchaseOrder(ByVal msg As MsmqMessage(Of PurchaseOrder))
    end interface
    
    Public Interface IOrderProcessorChannel
        Inherits IOrderProcessor, System.ServiceModel.IClientChannel
    End Interface
    
  2. Definieren Sie eine Clientklasse, über die der WCFWCF-Client den MSMQ-Empfänger aufruft.Define a client class that the WCFWCF client uses to call the MSMQ receiver.

    MsmqIntegrationBinding binding = new MsmqIntegrationBinding();
    EndpointAddress address = new EndpointAddress("msmq.formatname:DIRECT=OS:.\\private$\\Orders");
    ChannelFactory<IOrderProcessor> channelFactory = new ChannelFactory<IOrderProcessor>(binding, address);
    IOrderProcessor channel = channelFactory.CreateChannel();
    
    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;
    
    
    MsmqMessage<PurchaseOrder> ordermsg = new MsmqMessage<PurchaseOrder>(po);
    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
    {
        channel.SubmitPurchaseOrder(ordermsg);
        scope.Complete();
    }
    Console.WriteLine("Order has been submitted:{0}", po);
    
    Dim binding As New MsmqIntegrationBinding()
    Dim address As New EndpointAddress("msmq.formatname:DIRECT=OS:.\\private$\\Orders")
    Dim channelFactory As New ChannelFactory(Of IOrderProcessor)(binding, address)
    Dim channel As IOrderProcessor = channelFactory.CreateChannel()
    
    Dim po As New PurchaseOrder()
    po.customerId = "somecustomer.com"
    po.poNumber = Guid.NewGuid().ToString()
    
    Dim lineItem1 As New PurchaseOrderLineItem()
    lineItem1.productId = "Blue Widget"
    lineItem1.quantity = 54
    lineItem1.unitCost = 29.99F
    
    Dim lineItem2 = New PurchaseOrderLineItem()
    lineItem2.productId = "Red Widget"
    lineItem2.quantity = 890
    lineItem2.unitCost = 45.89F
    
    Dim lineItems(2) As PurchaseOrderLineItem
    lineItems(0) = lineItem1
    lineItems(1) = lineItem2
    
    po.orderLineItems = lineItems
    
    Dim ordermsg As MsmqMessage(Of PurchaseOrder) = New MsmqMessage(Of PurchaseOrder)(po)
    Using scope As New TransactionScope(TransactionScopeOption.Required)
        channel.SubmitPurchaseOrder(ordermsg)
        scope.Complete()
    End Using
    Console.WriteLine("Order has been submitted:{0}", po)
    
  3. Erstellen Sie eine Konfiguration, die die Verwendung der MsmqIntegrationBinding-Bindung angibt.Create a configuration that specifies use of the MsmqIntegrationBinding binding.

    MsmqIntegrationBinding binding = new MsmqIntegrationBinding("MyBindingConfig");
    
    Dim binding As New MsmqIntegrationBinding("MyBindingConfig")
    
  4. Erstellen Sie eine Instanz der Clientklasse, und rufen Sie die vom Nachrichten empfangenden Dienst definierte Methode auf.Create an instance of the client class and call the method defined by the message receiving service.

    // 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;
    
    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();
    
    Console.WriteLine();
    Console.WriteLine("Press <ENTER> to terminate client.");
    Console.ReadLine();
    

Siehe auchSee Also

WarteschlangenübersichtQueues Overview
Vorgehensweise: Austauschen von Nachrichten in einer Warteschlange mit WCD-EndpunktenHow to: Exchange Queued Messages with WCF Endpoints
Windows Communication Foundation zu Message QueuingWindows Communication Foundation to Message Queuing
Installieren von Message Queuing (MSMQ)Installing Message Queuing (MSMQ)
Message Queuing zu Windows Communication FoundationMessage Queuing to Windows Communication Foundation
Nachrichtensicherheit über Message QueuingMessage Security over Message Queuing