Behandlung nicht verarbeitbarer Nachrichten in MSMQ 4,0Poison Message Handling in MSMQ 4.0

In diesem Beispiel wird veranschaulicht, wie die Handhabung nicht verarbeitbarer Nachrichten in einem Dienst erfolgen soll.This sample demonstrates how to perform poison message handling in a service. Dieses Beispiel basiert auf der Binden von MSMQ transaktive Beispiel.This sample is based on the Transacted MSMQ Binding sample. In diesem Beispiel wird der netMsmqBinding verwendet.This sample uses the netMsmqBinding. 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.

In einer Warteschlangenkommunikation kommuniziert der Client über eine Warteschlange mit dem Dienst.In queued communication, the client communicates to the service using a queue. Genauer ausgedrückt bedeutet dies, dass der Client Nachrichten an eine Warteschlange sendet.More precisely, the client sends messages to a queue. Der Dienst empfängt Nachrichten aus der Warteschlange.The service receives messages from the queue. Folglich müssen der Dienst und der Client nicht gleichzeitig ausgeführt werden, um über eine Warteschlange zu kommunizieren.The service and client therefore, do not have to be running at the same time to communicate using a queue.

Eine nicht verarbeitbare Nachricht ist eine Nachricht, die wiederholt aus einer Warteschlange eingelesen wird, wenn der Dienst, der die Nachricht liest, diese nicht verarbeiten kann und daher die Transaktion abbricht, unter der die Nachricht gelesen wird.A poison message is a message that is repeatedly read from a queue when the service reading the message cannot process the message and therefore terminates the transaction under which the message is read. In solchen Fällen wird erneut versucht, die Nachricht zu verarbeiten.In such cases, the message is retried again. Dies kann theoretisch ewig so weitergehen, wenn ein Problem mit der Nachricht vorliegt.This can theoretically go on forever if there is a problem with the message. Beachten Sie, dass dieser Fall nur eintreten kann, wenn zum Lesen aus der Warteschlange und zum Aufrufen des Dienstvorgangs Transaktionen verwendet werden.Note that this can only occur when you use transactions to read from the queue and invoke the service operation.

Je nach MSMQ-Version unterstützt NetMsmqBinding eingeschränkte bis vollständige Erkennung von nicht verarbeitbaren Nachrichten.Based on the version of MSMQ, the NetMsmqBinding supports limited detection to full detection of poison messages. Nachdem die Nachricht als nicht verarbeitbar erkannt wurde, kann sie auf verschiedene Weisen gehandhabt werden.After the message has been detected as poisoned, then it can be handled in several ways. Wiederum in Abhängigkeit von der MSMQ-Version unterstützt NetMsmqBinding die eingeschränkte bis vollständige Handhabung von nicht verarbeitbaren Nachrichten.Again, based on the version of MSMQ, the NetMsmqBinding supports limited handling to full handling of poison messages.

In diesem Beispiel sehen Sie die eingeschränkten Funktionen für die Handhabung nicht verarbeiteter Nachrichten auf den Plattformen Windows Server 2003Windows Server 2003 und Windows XPWindows XP und die vollständigen Funktionen, die Windows VistaWindows Vista bietet.This sample illustrates the limited poison facilities provided on Windows Server 2003Windows Server 2003 and Windows XPWindows XP platform and the full poison facilities provided on Windows VistaWindows Vista. In beiden Beispielen besteht das Ziel darin, die nicht verarbeitbare Nachricht aus der Warteschlange in eine andere Warteschlange zu verschieben, in der dann ein Dienst für nicht verarbeitbare Nachrichten darauf angewendet werden kann.In both samples, the objective is move the poison message out of the queue to another queue which then can be serviced by a poison message service.

MSMQ v4.0 – Beispiel für Handhabung nicht verarbeitbarer NachrichtenMSMQ v4.0 Poison Handling Sample

In Windows VistaWindows Vista stellt MSMQ eine Funktion mit einer Unterwarteschlange zur Verfügung, in der nicht verarbeitbare Nachrichten gespeichert werden können.In Windows VistaWindows Vista, MSMQ provides a poison sub-queue facility that can be used to store poison messages. In diesem Beispiel wird die empfohlene Vorgehensweise für den Umgang mit nicht verarbeitbaren Nachrichten unter Windows VistaWindows Vista veranschaulicht.This sample demonstrates the best practice of dealing with poison messages using Windows VistaWindows Vista.

Die Erkennung nicht verarbeitbarer Nachrichten in Windows VistaWindows Vista ist ziemlich ausgereift.The poison message detection in Windows VistaWindows Vista is quite sophisticated. Es gibt 3 Eigenschaften, die bei der Erkennung behilflich sind.There are 3 properties that help with detection. ReceiveRetryCount gibt an, wie oft eine bestimmte Nachricht erneut aus der Warteschlange gelesen und zur Verarbeitung an die Anwendung übergeben wird.The ReceiveRetryCount is number of times a given message is re-read from the queue and dispatched to the application for processing. Eine Nachricht wird erneut aus der Warteschlange eingelesen, wenn sie wieder in die Warteschlange eingestellt wurde, weil sie nicht an die Anwendung übergeben werden konnte oder weil die Anwendung die Transaktion im Dienstvorgang zurücksetzt.A message is re-read from the queue when it is put back into the queue because the message cannot be dispatched to the application or the application rolls back the transaction in the service operation. MaxRetryCycles gibt an, wie oft die Nachricht in die Wiederholungswarteschlange verschoben wird.MaxRetryCycles is the number of times the message is moved to the retry queue. Wenn ReceiveRetryCount erreicht wird, wird die Nachricht in die Wiederholungswarteschlange verschoben.When ReceiveRetryCount is reached, the message is moved to the retry queue. Die Eigenschaft RetryCycleDelay ist die Zeitverzögerung, nach der die Nachricht aus der Wiederholungswarteschlange zurück in die Hauptwarteschlange verschoben wird.The property RetryCycleDelay is the time delay after which the message is moved from the retry queue back to the main queue. ReceiveRetryCount wird auf 0 zurückgesetzt.The ReceiveRetryCount is reset to 0. Es wird ein erneuter Versuch gestartet.The message is tried again. Wenn alle Versuche, die Nachricht zu lesen, fehlgeschlagen sind, wird die Nachricht als nicht verarbeitbar markiert.If all attempts to read the message have failed, then the message is marked as poisoned.

Sobald eine Nachricht als nicht verarbeitbar markiert wurde, wird damit gemäß den Einstellungen in der ReceiveErrorHandling-Enumeration verfahren.Once the message is marked as poisoned, the message is dealt with according to the settings in the ReceiveErrorHandling enumeration. So können Sie die möglichen Werte erneut durchlaufen:To reiterate the possible values:

  • "Fault" (Standard): Versetzt den Listener und auch den Diensthost in den Fehlerzustand.Fault (default): To fault the listener and also the service host.

  • "Drop": Verwirft die Nachricht.Drop: To drop the message.

  • "Move": Verschiebt die Nachricht in die Unterwarteschlange für potenziell schädliche Nachrichten.Move: To move the message to the poison message sub-queue. Dieser Wert ist nur unter Windows VistaWindows Vista verfügbar.This value is available only on Windows VistaWindows Vista.

  • "Reject": Lehnt die Nachricht ab und sendet sie zurück in die Warteschlange für unzustellbare Nachrichten des Absenders.Reject: To reject the message, sending the message back to the sender's dead-letter queue. Dieser Wert ist nur unter Windows VistaWindows Vista verfügbar.This value is available only on Windows VistaWindows Vista.

Im Beispiel wird die Verwendung der Move-Disposition für die nicht verarbeitbare Nachricht veranschaulicht.The sample demonstrates using the Move disposition for the poison message. Move führt dazu, dass die Nachricht in die Unterwarteschlange für potenziell schädliche Nachrichten verschoben wird.Move causes the message to move to the poison sub-queue.

Der Dienstvertrag ist IOrderProcessor, der einen unidirektionalen Dienst definiert, der für die Verwendung mit Warteschlangen geeignet ist.The service contract is IOrderProcessor, which defines a one-way service that is suitable for use with queues.

[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]  
public interface IOrderProcessor  
{  
    [OperationContract(IsOneWay = true)]  
    void SubmitPurchaseOrder(PurchaseOrder po);  
}  

Der Dienstvorgang zeigt eine Nachricht an, die angibt, dass der Auftrag verarbeitet wird.The service operation displays a message stating it is processing the order. Zur Demonstration der Funktion für nicht verarbeitbare Nachrichten löst der Dienst SubmitPurchaseOrder eine Ausnahme auf, um die Transaktion bei einem zufälligen Aufruf des Diensts zurückzusetzen.To demonstrate the poison message functionality, the SubmitPurchaseOrder service operation throws an exception to rollback the transaction on a random invocation of the service. Dadurch wird die Nachricht in die Warteschlange zurückgestellt.This causes the message to be put back in the queue. Schließlich wird die Nachricht als nicht verarbeitbar markiert.Eventually the message is marked as poison. Die Konfiguration wird so festgelegt, dass die nicht verarbeitbare Nachricht in die Unterwarteschlange für potenziell schädliche Nachrichten verschoben wird.The configuration is set to move the poison message to the poison sub-queue.

// Service class that implements the service contract.  
// Added code to write output to the console window.  
public class OrderProcessorService : IOrderProcessor  
{  
    static Random r = new Random(137);  

    [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]  
    public void SubmitPurchaseOrder(PurchaseOrder po)  
    {  

        int randomNumber = r.Next(10);  

        if (randomNumber % 2 == 0)  
        {  
            Orders.Add(po);  
            Console.WriteLine("Processing {0} ", po);  
        }  
        else  
        {  
            Console.WriteLine("Aborting transaction, cannot process purchase order: " + po.PONumber);  
            Console.WriteLine();  
            throw new Exception("Cannot process purchase order: " + po.PONumber);  
        }  
    }  

    public static void OnServiceFaulted(object sender, EventArgs e)   
    {  
        Console.WriteLine("Service Faulted");  
    }  

    // Host the service within this EXE console application.  
    public static void Main()  
    {  
        // Get MSMQ queue name from app settings in configuration.  
        string queueName = ConfigurationManager.AppSettings["queueName"];  

        // Create the transacted MSMQ queue if necessary.  
        if (!System.Messaging.MessageQueue.Exists(queueName))  
            System.Messaging.MessageQueue.Create(queueName, true);  

        // Get the base address that is used to listen for WS-MetaDataExchange requests.  
        // This is useful to generate a proxy for the client.  
        string baseAddress = ConfigurationManager.AppSettings["baseAddress"];  

        // Create a ServiceHost for the OrderProcessorService type.  
        ServiceHost serviceHost = new ServiceHost(typeof(OrderProcessorService), new Uri(baseAddress));  

        // Hook on to the service host faulted events.  
        serviceHost.Faulted += new EventHandler(OnServiceFaulted);  

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

        if(serviceHost.State != CommunicationState.Faulted) {  
            serviceHost.Close();  
        }  

    }  
}  

Die Dienstkonfiguration beinhaltet folgende Eigenschaften für nicht verarbeitbare Nachrichten: receiveRetryCount, maxRetryCycles, retryCycleDelay und receiveErrorHandling, wie in der folgenden Konfigurationsdatei gezeigt.The service configuration includes the following poison message properties: receiveRetryCount, maxRetryCycles, retryCycleDelay, and receiveErrorHandling as shown in the following configuration file.

<?xml version="1.0" encoding="utf-8" ?>  
<configuration>  
  <appSettings>  
    <!-- Use appSetting to configure MSMQ queue name. -->  
    <add key="queueName" value=".\private$\ServiceModelSamplesPoison" />  
    <add key="baseAddress" value="http://localhost:8000/orderProcessor/poisonSample"/>  
  </appSettings>  
  <system.serviceModel>  
    <services>  
      <service   
              name="Microsoft.ServiceModel.Samples.OrderProcessorService">  
        <!-- Define NetMsmqEndpoint -->  
        <endpoint address="net.msmq://localhost/private/ServiceModelSamplesPoison"  
                  binding="netMsmqBinding"  
                  bindingConfiguration="PoisonBinding"   
                  contract="Microsoft.ServiceModel.Samples.IOrderProcessor" />  
      </service>  
    </services>  

    <bindings>  
      <netMsmqBinding>  
        <binding name="PoisonBinding"   
                 receiveRetryCount="0"  
                 maxRetryCycles="1"  
                 retryCycleDelay="00:00:05"                        
                 receiveErrorHandling="Move">  
        </binding>  
      </netMsmqBinding>  
    </bindings>  
  </system.serviceModel>  
</configuration>  

Verarbeiten von Nachrichten aus der Warteschlange für potenziell schädliche NachrichtenProcessing messages from the poison message queue

Der Dienst für nicht verarbeitbare Nachrichten liest Nachrichten aus der endgültigen Warteschlange für potenziell schädliche Nachrichten und verarbeitet sie.The poison message service reads messages from the final poison message queue and processes them.

Nachrichten in der Warteschlange für potenziell schädliche Nachrichten sind Nachrichten, die an den Dienst adressiert sind, der die Nachricht verarbeitet; dieser kann vom Dienst-Endpunkt für nicht verarbeitbare Nachrichten abweichen.Messages in the poison message queue are messages that are addressed to the service that is processing the message, which could be different from the poison message service endpoint. Daher, wenn der Dienst für nicht verarbeitbare Nachrichten aus der Warteschlange liest, die WCF-Kanalschicht-Kanalebene die fehlende Übereinstimmung bei den Endpunkten und verteilt die Nachricht nicht.Therefore, when the poison message service reads messages from the queue, the WCF channel layer finds the mismatch in endpoints and does not dispatch the message. In diesem Fall ist die Nachricht an den Auftragsverarbeitungsdienst adressiert, wird jedoch vom Dienst für nicht verarbeitete Nachrichten empfangen.In this case, the message is addressed to the order processing service but is being received by the poison message service. Damit die Nachricht empfangen wird, selbst wenn sie an einen anderen Endpunkt adressiert ist, muss ServiceBehavior zum Filtern von Adressen hinzugefügt werden, wobei das Übereinstimmungskriterium darin besteht, mit jedem Dienst-Endpunkt übereinzustimmen, an den die Nachricht adressiert ist.To continue to receive the message even if the message is addressed to a different endpoint, we must add a ServiceBehavior to filter addresses where the match criterion is to match any service endpoint the message is addressed to. Dies ist erforderlich, um Nachrichten, die aus der Warteschlange für potenziell schädliche Nachrichten gelesen werden, erfolgreich zu verarbeiten.This is required to successfully process messages that you read from the poison message queue.

Die Implementierung des Diensts für nicht verarbeitbare Nachrichten selbst weist große Ähnlichkeiten mit der Dienstimplementierung auf.The poison message service implementation itself is very similar to the service implementation. Sie implementiert den Vertrag und verarbeitet die Aufträge.It implements the contract and processes the orders. Hier das Codebeispiel.The code example is as follows.

// Service class that implements the service contract.  
// Added code to write output to the console window.  
[ServiceBehavior(AddressFilterMode=AddressFilterMode.Any)]  
public class OrderProcessorService : IOrderProcessor  
{  
    [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]  
    public void SubmitPurchaseOrder(PurchaseOrder po)  
    {  
        Orders.Add(po);  
        Console.WriteLine("Processing {0} ", po);  
    }  

    public static void OnServiceFaulted(object sender, EventArgs e)   
    {  
        Console.WriteLine("Service Faulted...exiting app");  
        Environment.Exit(1);  
    }  

    // Host the service within this EXE console application.  
    public static void Main()  
    {  

        // Create a ServiceHost for the OrderProcessorService type.  
        ServiceHost serviceHost = new ServiceHost(typeof(OrderProcessorService));  

        // Hook on to the service host faulted events.  
        serviceHost.Faulted += new EventHandler(OnServiceFaulted);  

        serviceHost.Open();  

        // The service can now be accessed.  
        Console.WriteLine("The poison message service is ready.");  
        Console.WriteLine("Press <ENTER> to terminate service.");  
        Console.WriteLine();  
        Console.ReadLine();  

        // Close the ServiceHostBase to shutdown the service.  
        if(serviceHost.State != CommunicationState.Faulted)  
        {  
            serviceHost.Close();  
        }  
    }  

Im Gegensatz zum Auftragsverarbeitungsdienst, der Nachrichten aus der Auftragswarteschlange liest, liest der Dienst für nicht verarbeitbare Nachrichten Nachrichten aus der Unterwarteschlange für potenziell schädliche Nachrichten.Unlike the order processing service that reads messages from the order queue, the poison message service reads messages from the poison sub-queue. Die Warteschlange für potenziell schädliche Nachrichten ist eine Unterwarteschlange der Hauptwarteschlange, trägt den Namen "poison" und wird automatisch von MSMQ generiert.The poison queue is a sub-queue of the main queue, is named "poison" and is automatically generated by MSMQ. Um darauf zuzugreifen, geben Sie den Namen der Hauptwarteschlange, gefolgt von ";" und dem Namen der Unterwarteschlange (in diesem Fall -"poison") an, wie in der folgenden Beispielkonfiguration gezeigt.To access it, provide the main queue name followed by a ";" and the sub-queue name, in this case -"poison", as shown in the following sample configuration.

Hinweis

Im Beispiel für MSMQ v3.0 handelt es sich beim Namen der Warteschlange für potenziell schädliche Nachrichten ("poison") nicht um eine Unterwarteschlange, sondern vielmehr um die Warteschlange, in die die Nachricht verschoben wurde.In the sample for MSMQ v3.0, the poison queue name is not a sub-queue, rather the queue that we moved the message to.

<?xml version="1.0" encoding="utf-8" ?>  
<configuration>  
  <system.serviceModel>  
    <services>  
      <service name="Microsoft.ServiceModel.Samples.OrderProcessorService">  
        <!-- Define NetMsmqEndpoint -->  
        <endpoint address="net.msmq://localhost/private/ServiceModelSamplesPoison;poison"  
                  binding="netMsmqBinding"  
                  contract="Microsoft.ServiceModel.Samples.IOrderProcessor" >  
        </endpoint>  
      </service>  
    </services>  

  </system.serviceModel>  
</configuration>  

Wenn Sie das Beispiel ausführen, werden die Client- und Dienstaktivitäten sowie die Dienstaktivitäten für nicht verarbeitbare Nachrichten in Konsolenfenstern angezeigt.When you run the sample, the client, service, and poison message service activities are displayed in 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 die Dienste herunterzufahren.Press ENTER in each console window to shut down the services.

Der Dienst beginnt mit der Ausführung, verarbeitet Aufträge und beginnt zu einem nach dem Zufallsprinzip ausgewählten Zeitpunkt, die Verarbeitung abzubrechen.The service starts running, processing orders and at random starts to terminate processing. Wenn die Nachricht angibt, dass der Auftrag verarbeitet wurde, können Sie den Client erneut ausführen, um eine weitere Nachricht zu senden, bis Sie feststellen, dass der Dienst die Verarbeitung einer Nachricht tatsächlich abgebrochen hat.If the message indicates it has processed the order, you can run the client again to send another message until you see the service has actually terminated a message. Gemäß den konfigurierten Einstellungen für nicht verarbeitbare Nachrichten wird noch einmal versucht, die Nachricht zu verarbeiten, bevor sie in die endgültige Warteschlange für potenziell schädliche Nachrichten ("poison") verschoben wird.Based on the configured poison settings, the message is tried once for processing before moving it to the final poison queue.

The service is ready.  
Press <ENTER> to terminate service.  

Processing Purchase Order: 0f063b71-93e0-42a1-aa3b-bca6c7a89546  
        Customer: somecustomer.com  
        OrderDetails  
                Order LineItem: 54 of Blue Widget @unit price: $29.99  
                Order LineItem: 890 of Red Widget @unit price: $45.89  
        Total cost of this order: $42461.56  
        Order status: Pending  

Processing Purchase Order: 5ef9a4fa-5a30-4175-b455-2fb1396095fa  
        Customer: somecustomer.com  
        OrderDetails  
                Order LineItem: 54 of Blue Widget @unit price: $29.99  
                Order LineItem: 890 of Red Widget @unit price: $45.89  
        Total cost of this order: $42461.56  
        Order status: Pending  

Aborting transaction, cannot process purchase order: 23e0b991-fbf9-4438-a0e2-20adf93a4f89  

Starten Sie den Dienst für nicht verarbeitbare Nachrichten, um die nicht verarbeitbare Nachricht aus der Warteschlange für potenziell schädliche Nachrichten zu lesen.Start up the poison message service to read the poisoned message from the poison queue. In diesem Beispiel liest der Dienst für nicht verarbeitbare Nachrichten die Nachricht und verarbeitet sie.In this example, the poison message service reads the message and processes it. Sie können sehen, dass die Bestellung, die abgebrochen und als nicht verarbeitbar gekennzeichnet wurde, vom Dienst für nicht verarbeitbare Nachrichten gelesen wird.You could see that the purchase order that was terminated and poisoned is read by the poison message service.

The service is ready.  
Press <ENTER> to terminate service.  

Processing Purchase Order: 23e0b991-fbf9-4438-a0e2-20adf93a4f89  
        Customer: somecustomer.com  
        OrderDetails  
                Order LineItem: 54 of Blue Widget @unit price: $29.99  
                Order LineItem: 890 of Red Widget @unit price: $45.89  
        Total cost of this order: $42461.56  
        Order status: Pending  

So können Sie das Beispiel einrichten, erstellen und ausführenTo set up, 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. Um das Beispiel in einer Einzelcomputer- oder computerübergreifenden Konfiguration ausführen möchten, ändern Sie den Warteschlangennamen entsprechen den tatsächlichen Hostnamen anstelle von "localhost", und befolgen die Anweisungen im Ausführen der Windows Communication Foundation-Beispiele.To run the sample in a single- or cross-computer configuration, change the queue names to reflect the actual hostname instead of localhost and follow the instructions in Running the Windows Communication Foundation Samples.

Standardmäßig wird mit der netMsmqBinding-Bindung die Transportsicherheit aktiviert.By default with the netMsmqBinding binding transport, security is enabled. Der Typ der Transportsicherheit wird durch zwei Eigenschaften festgelegt: MsmqAuthenticationMode und MsmqProtectionLevel.Two properties, MsmqAuthenticationMode and MsmqProtectionLevel, together determine the type of transport security. Standardmäßig wird der Authentifizierungsmodus als Windows festgelegt, und die Schutzebene wird auf Sign gesetzt.By default, the authentication mode is set to Windows and the protection level is set to Sign. Damit MSMQ die Authentifizierungs- und Signierungsfunktion bereitstellt, muss es ein Teil einer Domäne sein.For MSMQ to provide the authentication and signing feature, it must be part of a domain. Wenn Sie dieses Beispiel auf einem Computer ausführen, der nicht Teil einer Domäne ist, wird folgende Fehlermeldung ausgegeben: "Das interne Message Queuing-Zertifikat für diesen Benutzer ist nicht vorhanden".If you run this sample on a computer that is not part of a domain, you receive the following error: "User's internal message queuing certificate does not exist".

So führen Sie das Beispiel auf einem Computer aus, der zu einer Arbeitsgruppe gehörtTo run the sample on a computer joined to a workgroup

  1. Wenn Ihr Computer nicht zu einer Domäne gehört, deaktivieren Sie die Transportsicherheit, indem Sie den Authentifizierungsmodus und die Schutzebene auf None festlegen, wie in der folgenden Beispielkonfiguration gezeigt.If your computer is not part of a domain, turn off transport security by setting the authentication mode and protection level to None as shown in the following sample configuration:

    <bindings>  
        <netMsmqBinding>  
            <binding name="TransactedBinding">  
                <security mode="None"/>  
            </binding>  
        </netMsmqBinding>  
    </bindings>  
    

    Stellen Sie sicher, dass der Endpunkt der Bindung zugeordnet wird, indem Sie das bindingConfiguration-Attribut des Endpunkts entsprechend festlegen.Ensure the endpoint is associated with the binding by setting the endpoint's bindingConfiguration attribute.

  2. Ändern Sie die Konfiguration auf dem PoisonMessageServer, dem Server und dem Client, bevor Sie das Beispiel ausführen.Ensure that you change the configuration on the PoisonMessageServer, server and the client before you run the sample.

    Hinweis

    Das Festlegen von security mode auf None entspricht dem Festlegen von MsmqAuthenticationMode, MsmqProtectionLevel und der Message-Sicherheit auf None.Setting security mode to None is equivalent to setting MsmqAuthenticationMode, MsmqProtectionLevel, and Message security to None.

  3. Damit Meta Data Exchange funktionieren kann, registrieren Sie eine URL mit http-Bindung.In order for Meta Data Exchange to work, we register a URL with http binding. Dazu muss der Dienst in einem Befehlsfenster auf Administratorebene ausgeführt werden.This requires that the service run in an elevated command window. Andernfalls erhalten Sie eine Ausnahme wie z. B.: nicht behandelte Ausnahme: System.ServiceModel.AddressAccessDeniedException: HTTP URL nicht registrieren http://+:8000/ServiceModelSamples/service/.Otherwise, you get an exception such as: Unhandled Exception: System.ServiceModel.AddressAccessDeniedException: HTTP could not register URL http://+:8000/ServiceModelSamples/service/. Der Prozess verfügt nicht über die Zugriffsrechte für diesen Namespace (siehe http://go.microsoft.com/fwlink/?LinkId=70353 Einzelheiten).Your process does not have access rights to this namespace (see http://go.microsoft.com/fwlink/?LinkId=70353 for details). ---> System.Net.HttpListenerException: Der Zugriff wird verweigert.---> System.Net.HttpListenerException: Access is denied.

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, fahren Sie mit Windows Communication Foundation (WCF) und Windows Workflow Foundation (WF) Samples for .NET Framework 4 aller Windows Communication Foundation (WCF) herunterladen und WFWF Beispiele.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) 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\Net\MSMQ\Poison\MSMQ4

Siehe auchSee Also