Warteschlangen für unzustellbare MeldungenDead Letter Queues

Dieses Beispiel veranschaulicht das Behandeln und Verarbeiten von Nachrichten mit Fehlern bei der Zustellung.This sample demonstrates how to handle and process messages that have failed delivery. Es basiert auf der Binden von MSMQ transaktive Beispiel.It is based on the Transacted MSMQ Binding sample. In diesem Beispiel wird die netMsmqBinding-Bindung verwendet.This sample uses the netMsmqBinding binding. 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.

Hinweis

Die Setupprozedur und die Buildanweisungen für dieses Beispiel befinden sich am Ende dieses Themas.The setup procedure and build instructions for this sample are located at the end of this topic.

Hinweis

In diesem Beispiel werden alle Anwendungswarteschlangen für unzustellbare Nachrichten veranschaulicht, die nur auf Windows VistaWindows Vista verfügbar sind.This sample demonstrates each application dead letter queue that is only available on Windows VistaWindows Vista. Das Beispiel kann für die Verwendung der systemweiten Standardwarteschlangen für MSMQ 3.0 unter Windows Server 2003Windows Server 2003 und Windows XPWindows XP geändert werden.The sample can be modified to use the default system-wide queues for MSMQ 3.0 on Windows Server 2003Windows Server 2003 and Windows XPWindows XP.

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.

Da die Kommunikation über Warteschlangen zu einer gewissen Verzögerung führen kann, können Sie der Nachricht eine Gültigkeitsdauer zuweisen, um sicherzustellen, dass die Nachricht nach Ablauf der Gültigkeit nicht mehr an die Anwendung gesendet wird.Because queued communication can involve a certain amount of dormancy, you may want to associate a time-to-live value on the message to ensure that the message does not get delivered to the application if it has gone past the time. Es gibt auch Fälle, in denen eine Anwendung informiert werden muss, wenn eine Nachricht nicht zugestellt werden konnte.There are also cases, where an application must be informed whether a message failed delivery. In derartigen Fällen, wenn beispielsweise die Gültigkeitsdauer der Nachricht abgelaufen ist, oder wenn die Nachricht nicht zugestellt werden konnte, werden die Nachrichten in der Warteschlange für unzustellbare Nachrichten abgelegt.In all of these cases, such as when the time-to-live on the message has expired or the message failed delivery, the message is put in a dead letter queue. Die sendende Anwendung kann die Nachricht daraufhin in der Warteschlange für unzustellbare Nachrichten lesen und Gegenmaßnahmen ergreifen. Diese reichen von keiner Maßnahme bis zur Behebung der Ursache für die Unzustellbarkeit der Nachricht und erneuter Sendung.The sending application can then read the messages in the dead-letter queue and take corrective actions that range from no action to correcting the reasons for failed delivery and resending the message.

Die Warteschlange für unzustellbare Nachrichten in der NetMsmqBinding-Bindung wird in den folgenden Eigenschaften ausgedrückt:The dead-letter queue in the NetMsmqBinding binding is expressed in the following properties:

  • DeadLetterQueue-Eigenschaft, um die vom Client benötigte Art der Warteschlange für unzustellbare Nachrichten auszudrücken.DeadLetterQueue property to express the kind of dead-letter queue required by the client. Diese Enumeration verfügt über folgende Werte:This enumeration has the following values:

  • None: Für den Client ist keine Warteschlange für unzustellbare Nachrichten erforderlich.None: No dead-letter queue is required by the client.

  • System: Die Systemwarteschlange für unzustellbare Nachrichten wird verwendet, um unzustellbare Nachrichten zu speichern.System: The system dead-letter queue is used to store dead messages. Die Systemwarteschlange für unzustellbare Nachrichten wird von allen Anwendungen verwendet, die auf dem Computer ausgeführt werden.The system dead-letter queue is shared by all applications running on the computer.

  • Custom: Die in der CustomDeadLetterQueue-Eigenschaft angegebene benutzerdefinierte Warteschlange für unzustellbare Nachrichten wird verwendet, um unzustellbare Nachrichten zu speichern.Custom: A custom dead-letter queue specified using the CustomDeadLetterQueue property is used to store dead messages. Diese Funktion ist nur unter Windows VistaWindows Vista verfügbar.This feature is only available on Windows VistaWindows Vista. Dieser Wert wird verwendet, wenn die Anwendung ihre eigene Warteschlange für unzustellbare Nachrichten verwenden muss und diese nicht mit anderen Anwendungen auf dem gleichen Computer gemeinsam verwenden kann.This is used when the application must use its own dead letter queue instead of sharing it with other applications running on the same computer.

  • CustomDeadLetterQueue-Eigenschaft, um die spezifische Warteschlange für unzustellbare Nachrichten anzugeben.CustomDeadLetterQueue property to express the specific queue to use as a dead-letter queue. Diese ist nur unter Windows VistaWindows Vista verfügbar.This is available only in Windows VistaWindows Vista.

In diesem Beispiel sendet der Client einen Stapel von Nachrichten aus dem Bereich der Transaktion an den Dienst und legt einen willkürlichen niedrigen Wert für die Gültigkeitsdauer für diese Nachrichten fest (ca. 2 Sekunden).In this sample, the client sends a batch of messages to the service from within the scope of a transaction and specifies an arbitrarily low value for "time-to-live" for these messages (about 2 seconds). Der Client gibt auch eine benutzerdefinierte Warteschlange für unzustellbare Nachrichten an, in der abgelaufene Nachrichten abgelegt werden.The client also specifies a custom dead-letter queue to use to enqueue the messages that have expired.

Die Clientanwendung kann die Nachrichten in der Warteschlange für unzustellbare Nachrichten lesen und entweder versuchen, diese erneut zu senden, oder den Fehler beheben, der dazu führte, dass die Nachricht in der Warteschlange für unzustellbare Nachrichten abgelegt wurde, und die Nachricht dann senden.The client application can read the messages in the dead-letter queue and either retry sending the message or correct the error that caused the original message to be placed in the dead-letter queue and send the message. Im Beispiel zeigt der Client eine Fehlermeldung an.In the sample, the client displays an error message.

Der Dienstvertrag lautet IOrderProcessor, wie im folgenden Beispielcode gezeigt.The service contract is IOrderProcessor, as shown in the following sample code.

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

Der Dienstcode in diesem Beispiel wird mit der die Binden von MSMQ transaktive.The service code in the sample is that of the Transacted MSMQ Binding.

Die Kommunikation mit dem Dienst findet innerhalb des Bereichs der Transaktion statt.Communication with the service takes place within the scope of a transaction. Der Dienst liest die Nachrichten in der Warteschlange, führt den Vorgang aus und zeigt anschließend die Ergebnisse des Vorgangs an.The service reads messages from the queue, performs the operation and then displays the results of the operation. Die Anwendung erstellt auch eine Warteschlange für unzustellbare Nachrichten.The application also creates a dead-letter queue for dead-letter messages.

//The service contract is defined in generatedClient.cs, generated from the service by the svcutil tool.  

//Client implementation code.  
class Client  
{  
    static void Main()  
    {  
        // Get MSMQ queue name from app settings in configuration  
        string deadLetterQueueName = ConfigurationManager.AppSettings["deadLetterQueueName"];  

        // Create the transacted MSMQ queue for storing dead message if necessary.  
        if (!MessageQueue.Exists(deadLetterQueueName))  
            MessageQueue.Create(deadLetterQueueName, true);  

        // Create a proxy with given client endpoint configuration  
        OrderProcessorClient client = new OrderProcessorClient("OrderProcessorEndpoint");  

        // 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;  

        //Create a transaction scope.  
        using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))  
        {  
            // Make a queued call to submit the purchase order  
            client.SubmitPurchaseOrder(po);  
            // Complete the transaction.  
            scope.Complete();  
        }  

        client.Close();  

        Console.WriteLine();  
        Console.WriteLine("Press <ENTER> to terminate client.");  
        Console.ReadLine();  
    }  
}  

Die Konfiguration des Clients gibt eine kurze Zeitspanne an, während derer die Nachricht den Dienst erreichen muss.The client's configuration specifies a short duration for the message to reach the service. Wenn die Nachricht innerhalb der festgelegten Zeitspanne nicht übermittelt werden kann, läuft die Nachricht ab und wird in die Warteschlange für unzustellbare Nachrichten verschoben.If the message cannot be transmitted within the duration specified, the message expires and is moved to the dead-letter queue.

Hinweis

Der Client kann die Nachricht innerhalb der angegebenen Zeitspanne an die Dienstwarteschlange übermitteln.It is possible for the client to deliver the message to the service queue within the specified time. Um sicherzustellen, dass Sie die Ausführung des Diensts für unzustellbare Nachrichten beobachten können, sollten Sie den Client vor dem Start des Diensts ausführen.To ensure you see the dead-letter service in action, you should run the client before starting the service. Die Nachricht überschreitet das Zeitlimit und wird an den Dienst für unzustellbaren Nachrichten übermittelt.The message times out and is delivered to the dead-letter service.

Die Anwendung muss definieren, welche der Warteschlangen als Warteschlange für unzustellbare Nachrichten verwendet werden soll.The application must define which queue to use as its dead-letter queue. Wenn keine Warteschlange angegeben wird, wird die systemweite Standardtransaktionswarteschlange für unzustellbare Nachrichten verwendet.If no queue is specified, the default system-wide transactional dead-letter queue is used to queue dead messages. In diesem Beispiel gibt die Clientanwendung ihre eigene Anwendungswarteschlange für unzustellbare Nachrichten an.In this example, the client application specifies its own application dead-letter queue.

<?xml version="1.0" encoding="utf-8" ?>  
<configuration>  
  <appSettings>  
    <!-- use appSetting to configure MSMQ Dead Letter queue name -->  
    <add key="deadLetterQueueName" value=".\private$\ServiceModelSamplesOrdersAppDLQ"/>  
  </appSettings>  

  <system.serviceModel>  
    <client>  
      <!-- Define NetMsmqEndpoint -->  
      <endpoint name="OrderProcessorEndpoint"  
                address="net.msmq://localhost/private/ServiceModelSamplesDeadLetter"   
                binding="netMsmqBinding"   
                bindingConfiguration="PerAppDLQBinding"   
                contract="IOrderProcessor" />  
    </client>  

    <bindings>  
      <netMsmqBinding>  
        <binding name="PerAppDLQBinding"  
                 deadLetterQueue="Custom"  
                 customDeadLetterQueue="net.msmq://localhost/private/ServiceModelSamplesOrdersAppDLQ"   
                 timeToLive="00:00:02"/>  
      </netMsmqBinding>  
    </bindings>  
  </system.serviceModel>  

</configuration>  

Der Dienst für unzustellbare Nachrichten liest Nachrichten aus der Warteschlange für unzustellbare Nachrichten.The dead-letter message service reads messages from the dead-letter queue. Der Dienst für unzustellbare Nachrichten implementiert den IOrderProcessor-Vertrag.The dead-letter message service implements the IOrderProcessor contract. Seine Implementierung dient jedoch nicht der Verarbeitung von Aufträgen.Its implementation however is not to process orders. Der Dienst für unzustellbare Nachrichten ist ein Clientdienst und besitzt keine Funktion für die Verarbeitung von Aufträgen.The dead-letter message service is a client service and does not have the facility to process orders.

Hinweis

Die Warteschlange für unzustellbare Nachrichten ist eine Clientwarteschlange und befindet sich lokal zum Clientwarteschlangen-Manager.The dead-letter queue is a client queue and is local to the client queue manager.

Die Implementierung des Dienst für unzustellbare Nachrichten überprüft die Ursache für die fehlgeschlagene Zustellung und ergreift Abhilfemaßnahmen.The dead-letter message service implementation checks for the reason a message failed delivery and takes corrective measures. Die Ursache für die fehlgeschlagene Zustellung wird in zwei Enumerationen, DeliveryFailure und DeliveryStatus, aufgezeichnet.The reason for a message failure is captured in two enumerations, DeliveryFailure and DeliveryStatus. Sie können die MsmqMessageProperty vom OperationContext abrufen, wie im folgenden Beispiel dargestellt:You can retrieve the MsmqMessageProperty from the OperationContext as shown in the following sample code:

public void SubmitPurchaseOrder(PurchaseOrder po)  
{  
    Console.WriteLine("Submitting purchase order did not succed ", po);  
    MsmqMessageProperty mqProp =   
                  OperationContext.Current.IncomingMessageProperties[  
                  MsmqMessageProperty.Name] as MsmqMessageProperty;  
    Console.WriteLine("Message Delivery Status: {0} ",   
                                                mqProp.DeliveryStatus);  
    Console.WriteLine("Message Delivery Failure: {0}",   
                                               mqProp.DeliveryFailure);  
    Console.WriteLine();  
    …  
}

Nachrichten in der Warteschlange für unzustellbare Nachrichten sind Nachrichten, die an den Dienst adressiert sind, der die Nachricht verarbeitet.Messages in the dead-letter queue are messages that are addressed to the service that is processing the message. Daher, wenn der Dienst für unzustellbare Nachrichten Nachrichten aus der Warteschlange liest, die Kanalschicht Windows Communication Foundation (WCF)-Kanalebene die fehlende Übereinstimmung bei den Endpunkten und verteilt die Nachricht nicht.Therefore, when the dead-letter message service reads messages from the queue, the Windows Communication Foundation (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 unzustellbare Nachrichten empfangen.In this case, the message is addressed to the order processing service but is received by the dead-letter message service. Um Nachrichten zu empfangen, die an einen anderen Endpunkt adressiert sind, wird im ServiceBehavior ein Adressfilter für alle Adressen angegeben.To receive a message that is addressed to a different endpoint, an address filter to match any address is specified in the ServiceBehavior. Dies ist erforderlich, um Nachrichten, die aus der Warteschlange für unzustellbare Nachrichten gelesen werden, erfolgreich zu verarbeiten.This is required to successfully process messages that are read from the dead-letter queue.

In diesem Beispiel sendet der Dienst für unzustellbare Nachrichten die Nachricht erneut, wenn die Ursache für die Unzustellbarkeit eine Überschreitung des Zeitlimits war. Bei allen anderen Ursachen wird ein Zustellungsfehler angezeigt, wie im folgenden Beispielcode dargestellt:In this sample, the dead-letter message service resends the message if the reason for failure is that the message timed out. For all other reasons, it displays the delivery failure, as shown in the following sample code:

// Service class that implements the service contract.  
// Added code to write output to the console window.  
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single, ConcurrencyMode=ConcurrencyMode.Single, AddressFilterMode=AddressFilterMode.Any)]  
public class PurchaseOrderDLQService : IOrderProcessor  
{  
    OrderProcessorClient orderProcessorService;  
    public PurchaseOrderDLQService()  
    {  
        orderProcessorService = new OrderProcessorClient("OrderProcessorEndpoint");  
    }  

    [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]  
    public void SubmitPurchaseOrder(PurchaseOrder po)  
    {  
        Console.WriteLine("Submitting purchase order did not succeed ", po);  
        MsmqMessageProperty mqProp = OperationContext.Current.IncomingMessageProperties[MsmqMessageProperty.Name] as MsmqMessageProperty;  

        Console.WriteLine("Message Delivery Status: {0} ", mqProp.DeliveryStatus);  
        Console.WriteLine("Message Delivery Failure: {0}", mqProp.DeliveryFailure);  
        Console.WriteLine();  

        // resend the message if timed out  
        if (mqProp.DeliveryFailure == DeliveryFailure.ReachQueueTimeout ||  
            mqProp.DeliveryFailure == DeliveryFailure.ReceiveTimeout)  
        {  
            // re-send  
            Console.WriteLine("Purchase order Time To Live expired");  
            Console.WriteLine("Trying to resend the message");  

            // reuse the same transaction used to read the message from dlq to enqueue the message to app. queue  
            orderProcessorService.SubmitPurchaseOrder(po);  
            Console.WriteLine("Purchase order resent");  
        }  
    }  

    // Host the service within this EXE console application.  
    public static void Main()  
    {  
        // Create a ServiceHost for the PurchaseOrderDLQService type.  
        using (ServiceHost serviceHost = new ServiceHost(typeof(PurchaseOrderDLQService)))  
        {  
            // Open the ServiceHostBase to create listeners and start listening for messages.  
            serviceHost.Open();  

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

Im folgenden Beispiel wird die Konfiguration für eine unzustellbare Nachricht veranschaulicht:The following sample shows the configuration for a dead-letter message:

<?xml version="1.0" encoding="utf-8" ?>  
<configuration>  
  <system.serviceModel>  
    <services>  
      <service   
          name="Microsoft.ServiceModel.Samples.PurchaseOrderDLQService">  
        <!-- Define NetMsmqEndpoint in this case, DLQ end point to read messages-->  
        <endpoint address="net.msmq://localhost/private/ServiceModelSamplesOrdersAppDLQ"  
                  binding="netMsmqBinding"  
                  bindingConfiguration="DefaultBinding"   
                  contract="Microsoft.ServiceModel.Samples.IOrderProcessor" />  
      </service>  
    </services>  

    <client>  
      <!-- Define NetMsmqEndpoint -->  
      <endpoint name="OrderProcessorEndpoint"  
                 address="net.msmq://localhost/private/ServiceModelSamplesDeadLetter"   
                 binding="netMsmqBinding"   
                 bindingConfiguration="SystemDLQBinding"   
                 contract="IOrderProcessor" />  
    </client>  

    <bindings>  
      <netMsmqBinding>  
        <binding name="DefaultBinding" />  
        <binding name="SystemDLQBinding"  
                 deadLetterQueue="System"/>  
      </netMsmqBinding>  
    </bindings>  
  </system.serviceModel>  
</configuration>  

Wenn das Beispiel ausgeführt wird, müssen drei Programmdateien ausgeführt werden, um zu beobachten, wie die Warteschlange für unzustellbare Nachrichten für jede Anwendung funktioniert. Der Client, der Dienst und ein Dienst für unzustellbare Nachrichten, der in allen Anwendungen in der Warteschlange für unzustellbare Nachrichten liest und die Nachricht erneut an den Dienst sendet.In running the sample, there are 3 executables to run to see how the dead-letter queue works for each application; the client, service and a dead-letter service that reads from the dead-letter queue for each application and resends the message to the service. Alle sind Konsolenanwendungen mit Ausgabe in Konsolenfenster.All are console applications with output in console windows.

Hinweis

Aufgrund der Verwendung einer Warteschlange müssen der Client und der Dienst nicht gleichzeitig ausgeführt werden.Because queuing is in use, the client and service do not have to be up and running at the same time. Sie können den Client ausführen, ihn schließen und anschließend den Dienst starten, der dann trotzdem noch die Nachrichten des Clients empfängt.You can run the client, shut it down, and then start up the service and it still receives its messages. Sie sollten den Dienst starten und wieder schließen, damit die Warteschlange erstellt werden kann.You should start the service and shut it down so that the queue can be created.

Wenn der Client ausgeführt wird, zeigt er die folgende Nachricht an:When running the client, the client displays the message:

Press <ENTER> to terminate client.  

Der Client hat versucht, die Nachricht zu senden, aufgrund des kurzen Zeitlimits ist die Nachricht jedoch abgelaufen und befindet sich jetzt in der Warteschlange für unzustellbare Nachrichten für jede Anwendung.The client attempted to send the message but with a short timeout, the message expired and is now queued in the dead-letter queue for each application.

Anschließend führen Sie den Dienst für unzustellbare Nachrichten aus, der die Nachrichten liest, den Fehlercode anzeigt und die Nachricht zurück an den Dienst sendet.You then run the dead-letter service, which reads the message and displays the error code and resends the message back to the service.

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

Submitting purchase order did not succeed  
Message Delivery Status: InDoubt  
Message Delivery Failure: ReachQueueTimeout  

Purchase order Time To Live expired  
Trying to resend the message  
Purchase order resent  

Der Dienst startet, liest dann die erneut gesendeten Nachrichten und verarbeitet sie.The service starts and then reads the resent message and processes it.

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

Processing Purchase Order: 97897eff-f926-4057-a32b-af8fb11b9bf9  
        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. Führen Sie das Beispiel in einer Einzelcomputer- oder computerübergreifenden Konfiguration ändern Warteschlange Namen entsprechend, und Ersetzen Sie "localhost" durch den vollständigen Namen des Computers, und befolgen die Anweisungen in Ausführen der Windows Communication Foundation-Beispiele.To run the sample in a single- or cross-computer configuration change queue names appropriately, replacing localhost with full name of the computer and follow the instructions in Running the Windows Communication Foundation Samples.

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 ist, indem Sie das bindingConfiguration-Attribut des Endpunkts festlegen.Ensure the endpoint is associated with the binding by setting the endpoint's bindingConfiguration attribute.

  2. Ändern Sie die Konfiguration auf dem DeadLetterService, dem Server und dem Client, bevor Sie das Beispiel ausführen.Ensure that you change the configuration on the DeadLetterService, 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.

KommentareComments

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 auf 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".

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\DeadLetter

Siehe auchSee Also