Problembehandlung bei der KorrelationTroubleshooting Correlation

Mit Korrelation werden Workflowdienstnachrichten miteinander und mit der richtigen Workflowinstanz verknüpft. Wenn die Konfiguration jedoch nicht richtig durchgeführt wurde, werden Meldungen nicht empfangen, und Anwendungen funktionieren nicht ordnungsgemäß.Correlation is used to relate workflow service messages to each other and to the correct workflow instance, but if it is not configured correctly, messages will not be received and applications will not work correctly. Dieses Thema bietet eine Übersicht über mehrere Methoden zum Beheben von Korrelationsproblemen. Des Weiteren werden einige häufig auftretende Probleme aufgeführt, die bei der Verwendung der Korrelation auftreten können.This topic provides an overview of several methods for troubleshooting correlation issues, and also lists some common issues that can occur when you use correlation.

Behandeln des UnknownMessageReceived-EreignissesHandle the UnknownMessageReceived Event

Das UnknownMessageReceived-Ereignis tritt auf, wenn von einem Dienst eine unbekannte Meldung empfangen wird. Dazu zählen auch Meldungen, die nicht mit einer vorhandenen Instanz korreliert werden können.The UnknownMessageReceived event occurs when an unknown message is received by a service, including messages that cannot be correlated to an existing instance. Bei selbst gehosteten Diensten kann dieses Ereignis in der Hostanwendung behandelt werden.For self-hosted services, this event can be handled in the host application.

host.UnknownMessageReceived += delegate(object sender, UnknownMessageReceivedEventArgs e)  
{  
    Console.WriteLine("Unknown Message Received:");  
    Console.WriteLine(e.Message);  
};  

Bei im Internet gehosteten Diensten kann dieses Ereignis durch das Ableiten einer Klasse von WorkflowServiceHostFactory und Überschreiben der CreateWorkflowServiceHost behandelt werden.For Web-hosted services, this event can be handled by deriving a class from WorkflowServiceHostFactory and overriding CreateWorkflowServiceHost.

class CustomFactory : WorkflowServiceHostFactory  
{  
    protected override WorkflowServiceHost CreateWorkflowServiceHost(Activity activity, Uri[] baseAddresses)  
    {  
        // Create the WorkflowServiceHost.  
        WorkflowServiceHost host = new WorkflowServiceHost(activity, baseAddresses);  

        // Handle the UnknownMessageReceived event.  
        host.UnknownMessageReceived += delegate(object sender, UnknownMessageReceivedEventArgs e)  
        {  
            Console.WriteLine("Unknown Message Received:");  
            Console.WriteLine(e.Message);  
        };  

        return host;  
    }  
}  

Diese benutzerdefinierte WorkflowServiceHostFactory kann dann in der svc-Datei für den Dienst angegeben werden.This custom WorkflowServiceHostFactory can then be specified in the svc file for the service.

<% @ServiceHost Language="C#" Service="OrderServiceWorkflow" Factory="CustomFactory" %>  

Wenn dieser Handler aufgerufen wird, kann die Meldung mit der Message-Eigenschaft aus UnknownMessageReceivedEventArgs abgerufen werden. Die Meldung kann wie folgt aussehen.When this handler is invoked, the message can be retrieved by using the Message property of the UnknownMessageReceivedEventArgs, and will resemble the following message.

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">  
  <s:Header>  
    <To s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://localhost:8080/OrderService</To>  
    <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/IService/AddItem</Action>  
  </s:Header>  
  <s:Body>  
    <AddItem xmlns="http://tempuri.org/">  
      <Item>Books</Item>  
    </AddItem>  
  </s:Body>  
</s:Envelope>  

An den UnknownMessageReceived-Handler weitergeleitete Meldungen enthalten möglicherweise Hinweise dazu, warum die Meldung nicht mit einer Instanz des Workflowdiensts korreliert.Inspecting messages dispatched to the UnknownMessageReceived handler may provide clues about why the message did not correlate to an instance of the workflow service.

Überwachen des Workflowstatus mit der NachverfolgungUse Tracking to Monitor the Progress of the Workflow

Eine Möglichkeit für das Überwachen des Status eines Workflows ist die Nachverfolgung.Tracking provides a way to monitor the progress of a workflow. Standardmäßig werden Nachverfolgungsdatensätze für Ereignisse des Workflowlebenszyklus und Aktivitätslebenszyklus sowie zur Fehlerverteilung und Lesezeichenwiederaufnahme ausgegeben.By default, tracking records are emitted for workflow life-cycle events, activity life-cycle events, fault propagation, and bookmark resumption. Darüber hinaus können von benutzerdefinierten Aktivitäten benutzerdefinierte Nachverfolgungsdatensätze ausgegeben werden.Additionally, custom tracking records can be emitted by custom activities. Bei der Behandlung von Korrelationsproblemen erweisen sich die Datensätze zur Aktivitätsnachverfolgung, Lesezeichenwiederaufnahme und Fehlerverteilung als besonders nützlich.When troubleshooting correlation, the activity tracking records, the bookmark resumption records, and the fault propagation records are the most useful. Mit den Datensätzen zur Aktivitätsnachverfolgung kann der aktuelle Status des Workflows festgestellt und bestimmt werden, welche Meldungsaktivität gerade auf Meldungen wartet.The activity tracking records can be used to determine the current progress of the workflow and can help identify which messaging activity is currently waiting for messages. Datensätze zur Lesezeichenwiederaufnahme sind hilfreich, da sie angeben, dass eine Meldung vom Workflow empfangen wurde. Datensätze zur Fehlerverteilung enthalten einen Datensatz mit sämtlichen Fehlern im Workflow.Bookmark resumption records are useful because they indicate that a message was received by the workflow, and fault propagation records provide a record of any faults in the workflow. Um die Nachverfolgung zu aktivieren, geben Sie den gewünschten TrackingParticipant in den WorkflowExtensions des WorkflowServiceHost an.To enable tracking, specify the desired TrackingParticipant in the WorkflowExtensions of the WorkflowServiceHost. Im folgenden Beispiel die ConsoleTrackingParticipant (aus der benutzerdefinierte nachverfolgung Beispiel) unter Verwendung des standardmäßigen Überwachungsprofil konfiguriert ist.In the following example, the ConsoleTrackingParticipant (from the Custom Tracking sample) is configured by using the default tracking profile.

host.WorkflowExtensions.Add(new ConsoleTrackingParticipant());  

Ein Nachverfolgungsteilnehmer (z. B. der ConsoleTrackingParticipant) ist nützlich bei selbst gehosteten Workflowdiensten mit Konsolenfenster.A tracking participant such as the ConsoleTrackingParticipant is useful for self-hosted workflow services that have a console window. Für einen im Internet gehosteten Dienst ein Nachverfolgungsteilnehmer, der einen permanenten Speicher die Überwachungsinformationen protokolliert sollte verwendet werden, z. B. die integrierten EtwTrackingParticipant, oder einen benutzerdefinierten Überwachungsteilnehmer, der die Informationen wie z. B. in einer Datei protokolliert die TextWriterTrackingParticpant aus der Überwachung mithilfe einer Textdatei Beispiel.For a Web-hosted service, a tracking participant that logs the tracking information to a durable store should be used, such as the built-in EtwTrackingParticipant, or a custom tracking participant that logs the information to a file, such as the TextWriterTrackingParticpant from the Tracking Using a Text File sample.

Weitere Informationen zum Überwachen und Konfigurieren von Überwachung für einen im Internet gehosteten Workflowdienst finden Sie unter nachverfolgung und Ablaufverfolgung für Workflows, Konfigurieren der nachverfolgung für einen Workflow, und die Nachverfolgen von [WF-Beispiele] Beispiele.For more information about tracking and configuring tracking for a Web-hosted workflow service, see Workflow Tracking and Tracing, Configuring Tracking for a Workflow, and the Tracking [WF Samples] samples.

Verwenden der WCF-AblaufverfolgungUse WCF Tracing

Die WCF-Ablaufverfolgung stellt eine Ablaufverfolgung des Meldungsflusses zu und von einem Workflowdienst bereit.WCF tracing provides tracing of the flow of messages to and from a workflow service. Diese Ablaufverfolgungsinformationen sind nützlich bei der Behebung von Korrelationsproblemen, besonders bei inhaltsbasierter Korrelation.This tracing information is useful when troubleshooting correlation issues, especially for content-based correlation. Geben Sie zum Aktivieren der Ablaufverfolgung die gewünschten Ablaufverfolgungslistener im Abschnitt system.diagnostics der Datei web.config an, wenn es sich um einen im Internet gehosteten Workflowdienst handelt, bzw. in der Datei app.config, wenn es sich um einen selbst gehosteten Workflowdienst handelt.To enable tracing, specify the desired trace listeners in the system.diagnostics section of the web.config file if the workflow service is Web-hosted, or the app.config file if the workflow service is self-hosted. Geben Sie im true-Element im Abschnitt logEntireMessage des messageLogging für diagnostics den Wert system.serviceModel an, um den Inhalt der Meldungen in die Ablaufverfolgungsdatei aufzunehmen.To include the contents of the messages in the trace file, specify true for logEntireMessage in the messageLogging element in the diagnostics section of system.serviceModel. Im folgenden Beispiel werden Ablaufverfolgungsinformationen einschließlich des Inhalts der Meldungen so konfiguriert, dass sie in eine Datei mit dem Namen service.svclog geschrieben werden.In the following example, tracing information, including the content of the messages, is configured to be written to a file that is named service.svclog.

<?xml version="1.0" encoding="utf-8" ?>  
<configuration>  
  <system.diagnostics>  
    <sources>  
      <source name="System.ServiceModel" switchValue="Information" propagateActivity="true">  
        <listeners>  
          <add name="corr"/>  
        </listeners>  
      </source>  
      <source name="System.ServiceModel.MessageLogging">  
        <listeners>  
          <add name="corr"/>  
        </listeners>  
      </source>  
    </sources>  

    <sharedListeners>  
      <add name="corr" type="System.Diagnostics.XmlWriterTraceListener" initializeData="c:\logs\service.svclog">  
      </add>  
    </sharedListeners>  
  </system.diagnostics>  

  <system.serviceModel>  
    <diagnostics>  
      <messageLogging logEntireMessage="true" logMalformedMessages="false"  
         logMessagesAtServiceLevel="false" logMessagesAtTransportLevel="true" maxSizeOfMessageToLog="2147483647">  
      </messageLogging>  
    </diagnostics>  
  </system.serviceModel>  
</configuration>  

So zeigen Sie die Ablaufverfolgungsinformationen an, die in enthalten ist service.svclog, Service Trace Viewer-Tool (SvcTraceViewer.exe) verwendet wird.To view the trace information that is contained in service.svclog, the Service Trace Viewer Tool (SvcTraceViewer.exe) is used. Dies ist besonders beim Beheben von inhaltsbasierten Korrelationsproblemen hilfreich, da Sie die Meldungsinhalte anzeigen und genau sehen können, welche Daten übergeben werden und ob diese mit der CorrelationQuery für die inhaltsbasierte Korrelation übereinstimmen.This is especially useful when troubleshooting content-based correlation issues because you can view the message contents and see exactly what is being passed, and whether it matches the CorrelationQuery for the content-based correlation. Weitere Informationen zur WCF-Ablaufverfolgung finden Sie unter Service Trace Viewer-Tool (SvcTraceViewer.exe), Konfigurieren der Ablaufverfolgung, und mithilfe-Ablaufverfolgung zum Beheben der Anwendung.For more information about WCF tracing, see Service Trace Viewer Tool (SvcTraceViewer.exe), Configuring Tracing, and Using Tracing to Troubleshoot Your Application.

Allgemeine Probleme bei der KontextaustauschkorrelationCommon Context Exchange Correlation Issues

Bestimmte Korrelationstypen erfordern einen bestimmten Bindungstyp, damit die Korrelation einwandfrei funktioniert.Certain types of correlation require that a specific type of binding is used for the correlation to work correctly. Beispiele sind die Anforderung-Antwort-Korrelation, die eine bidirektionale Bindung (z. B. BasicHttpBinding) erfordert, und die Kontextaustauschkorrelation, die eine kontextbasierte Bindung (z. B. BasicHttpContextBinding) erfordert.Examples include request-reply correlation, which requires a two-way binding such as BasicHttpBinding, and context exchange correlation, which requires a context-based binding such as BasicHttpContextBinding. Die meisten Bindungen unterstützen bidirektionale Vorgänge, sodass dies kein häufig auftretendes Problem bei der Anforderung-Antwort-Korrelation ist. Es gibt jedoch nur wenige kontextbasierte Bindungen, z. B. BasicHttpContextBinding, WSHttpContextBinding und NetTcpContextBinding.Most bindings support two-way operations so this is not a common issue for request-reply correlation, but there are only a handful of context-based bindings including BasicHttpContextBinding, WSHttpContextBinding, and NetTcpContextBinding. Wenn eine dieser Bindungen nicht verwendet wird, kann der erste Aufruf eines Workflowdiensts erfolgreich ausgeführt werden. Die nachfolgenden Aufrufe geben jedoch die folgende FaultException als Fehler zurück.If one of these bindings is not used, the initial call to a workflow service will succeed, but subsequent calls will fail with the following FaultException.

There is no context attached to the incoming message for the service   
and the current operation is not marked with "CanCreateInstance = true".   
In order to communicate with this service check whether the incoming binding   
supports the context protocol and has a valid context initialized.  

Die für die Kontextkorrelation verwendeten Kontextinformationen können von der SendReply an die Receive-Aktivität zurückgegeben werden, die die Kontextkorrelation initialisiert, falls ein bidirektionaler Vorgang verwendet wird. Wenn es sich um einen unidirektionalen Vorgang handelt, kann der Aufrufer die Kontextinformationen angeben.The context information that is used for context correlation can be returned by the SendReply to the Receive activity that initializes the context correlation when using a two-way operation, or it can be specified by the caller if the operation is one-way. Wird der Kontext nicht vom Aufrufer gesendet oder vom Workflowdienst zurückgegeben, wird die bereits zuvor beschriebene FaultException zurückgegeben, wenn ein nachfolgender Vorgang aufgerufen wird.If the context is not sent by the caller or returned by the workflow service, then the same FaultException described previously will be returned when a subsequent operation is invoked.

Weitere Informationen finden Sie unter Kontextaustausch.For more information, see Context Exchange.

Allgemeine Probleme bei der Anforderung-Antwort-KorrelationCommon Request-Reply Correlation Issues

Anforderung-Antwort-Korrelation wird verwendet, mit einem Receive / SendReply -Paar, das einen bidirektionalen Vorgang in einem Workflowdienst und mit implementieren eine Send / ReceiveReply -Paar, das einen bidirektionalen in eine andere Web Vorgang -Dienst.Request-reply correlation is used with a Receive/SendReply pair to implement a two-way operation in a workflow service and with a Send/ReceiveReply pair that invokes a two-way operation in another Web service. Beim Aufrufen der eines bidirektionalen Vorgangs in einem WCF-Dienst der Dienst kann entweder eine herkömmliche imperative codebasierte WCF-Dienst, oder es kann ein Workflowdienst sein.When invoking a two-way operation in a WCF service, the service can be either a traditional imperative code-based WCF service or it can be a workflow service. Für die Anforderung-Antwort-Korrelation muss eine bidirektionale Bindung verwendet werden (z. B. BasicHttpBinding). Außerdem müssen die Vorgänge bidirektional ausgelegt sein.To use request-reply correlation a two-way binding must be used, such as BasicHttpBinding, and the operations must be two-way.

Verfügt der Workflowdienst bidirektionale Vorgänge Parallel oder überlappende Receive / SendReply oder Send / ReceiveReply -Paare, und klicken Sie dann auf die implizite Korrelation handleverwaltung von bereitgestelltenWorkflowServiceHostmöglicherweise nicht genügend, besonders in Szenarien mit hoher, und werden Nachrichten möglicherweise nicht korrekt weitergeleitet.If the workflow service has two-way operations in parallel, or overlapping Receive/SendReply or Send/ReceiveReply pairs, then the implicit correlation handle management provided by WorkflowServiceHost may not be sufficient, especially in high-stress scenarios, and messages may not be correctly routed. Zur Verhinderung dieses Problems empfiehlt es sich, bei der Verwendung der Anforderung-Antwort-Korrelation immer explizit einen CorrelationHandle anzugeben.To prevent this issue from occurring, we recommend that you always explicitly specify a CorrelationHandle when using request-reply correlation. Bei Verwendung der SendAndReceiveReply und ReceiveAndSendReply Vorlagen im Abschnitt Messaging der der Toolbox im Workflow-Designer eine CorrelationHandle Standardmäßig wird explizit konfiguriert werden.When using the SendAndReceiveReply and ReceiveAndSendReply templates from the Messaging section of the Toolbox in the workflow designer, a CorrelationHandle is explicitly configured by default. Bei der Erstellung eines Workflows mithilfe von Code wird der CorrelationHandle in den CorrelationInitializers der ersten Aktivität des Paars angegeben.When building a workflow by using code, the CorrelationHandle is specified in the CorrelationInitializers of the first activity in the pair. Im folgenden Beispiel wird eine Receive-Aktivität mit einem expliziten CorrelationHandle, der im RequestReplyCorrelationInitializer angegeben wurde, konfiguriert.In the following example, a Receive activity is configured with an explicit CorrelationHandle specified in the RequestReplyCorrelationInitializer.

Variable<CorrelationHandle> RRHandle = new Variable<CorrelationHandle>();  

Receive StartOrder = new Receive  
{  
    CanCreateInstance = true,  
    ServiceContractName = OrderContractName,  
    OperationName = "StartOrder",  
    CorrelationInitializers =  
    {  
        new RequestReplyCorrelationInitializer  
        {  
            CorrelationHandle = RRHandle  
        }  
    }  
};  

SendReply ReplyToStartOrder = new SendReply  
{  
    Request = StartOrder,  
    Content = ... // Contains the return value, if any.  
};  

// Construct a workflow using StartOrder and ReplyToStartOrder.  

Persistenz ist nicht zulässig, zwischen einer Receive / SendReply Paar oder ein Send / ReceiveReply Paar.Persistence is not permitted between a Receive/SendReply pair or a Send/ReceiveReply pair. Es wird eine Zone ohne Persistenz erstellt, die vorhanden ist, bis beide Aktivitäten abgeschlossen wurden.A no-persist zone is created that lasts until both activities have completed. Wenn in der Zone ohne Persistenz eine Aktivität, z. B. eine Verzögerungsaktivität, vorhanden ist, die den Workflow in den Leerlauf versetzt, bleibt der Workflow nicht erhalten, auch wenn der Host zum Beibehalten von in den Leerlauf versetzten Workflows konfiguriert ist.If an activity, such as a delay activity, is in this no-persist zone and causes the workflow to become idle, the workflow will not persist even if it the host is configured to persist workflows when they become idle. Wenn eine Aktivität, z. B. eine Persist-Aktivität, den Workflow in der Zone ohne Persistenz explizit beizubehalten versucht, wird ein schwerwiegender Ausnahmefehler ausgelöst, der Workflow wird abgebrochen, und an den Aufrufer wird eine FaultException zurückgegeben.If an activity, such as a persist activity, attempts to explicitly persist in the no-persist zone, a fatal exception is thrown, the workflow aborts, and a FaultException is returned to the caller. Die Meldung zum schwerwiegenden Ausnahmefehler lautet "System.InvalidOperationException: Persist-Aktivitäten können nicht in nicht persistenten Blöcken enthalten sein."The fatal exception message is "System.InvalidOperationException: Persist activities cannot be contained within no persistence blocks.". Diese Ausnahme wird nicht an den Aufrufer zurückgegeben, sie kann jedoch angezeigt werden, wenn Nachverfolgung aktiviert ist.This exception is not returned to the caller but can be observed if tracking is enabled. Die für die FaultException an den Aufrufer zurückgegebene Meldung lautet "Der Vorgang konnte nicht ausgeführt werden, da die Workflowinstanz '5836145b-7da2-49d0-a052-a49162adeab6' abgeschlossen wurde".The message for the FaultException returned to the caller is "The operation could not be performed because WorkflowInstance '5836145b-7da2-49d0-a052-a49162adeab6' has completed".

Weitere Informationen zu Anforderung-Antwort-Korrelation, finden Sie unter Anforderung / Antwort-.For more information about request-reply correlation, see Request-Reply.

Allgemeine Probleme bei der InhaltskorrelationCommon Content Correlation Issues

Die inhaltsbasierte Korrelation wird verwendet, wenn ein Workflowdienst mehrere Meldungen empfängt und ein Datenelement in den ausgetauschten Nachrichten die gewünschte Instanz angibt.Content-based correlation is used when a workflow service receives multiple messages and a piece of data in the exchanged messages identifies the desired instance. Die inhaltsbasierte Korrelation verwendet diese Daten in der Nachricht, z. B. eine Kundennummer oder Bestell-ID, um Nachrichten an die richtige Workflowinstanz weiterzuleiten.Content-based correlation uses this data in the message, such as a customer number or order ID, to route messages to the correct workflow instance. In diesem Abschnitt werden mehrere häufig auftretende Probleme beschrieben, die bei der inhaltsbasierten Korrelation vorkommen können.This section describes several common issues that may occur when using content-based correlation.

Sicherstellen, dass die identifizierenden Daten eindeutig sindEnsure the Identifying Data Is Unique

Die Daten zur Identifikation der Instanz werden per Hash in einen Korrelationsschlüssel umgewandelt.The data that is used to identify the instance is hashed into a correlation key. Dabei müssen Sie sicherstellen, dass die für die Korrelation verwendeten Daten eindeutig sind, da sonst Konflikte im Hashschlüssel auftreten und Nachrichten ggf. falsch weitergeleitet werden können.Care must be taken to guarantee that the data that is used for correlation is unique or else collisions in the hashed key might occur and cause messages to be misrouted. Wenn eine Korrelation z. B. ausschließlich auf einem Kundennamen basiert, kann es zu einem Konflikt kommen, da es möglicherweise mehrere Kunden mit dem gleichen Namen gibt.For example, a correlation based only on a customer name may cause a collision because there may be multiple customers who have the same name. Der Doppelpunkt (:) darf nicht als Bestandteil der Daten verwendet werden, mit denen die Meldung korreliert wird, da hiermit bereits Schlüssel und Wert der Meldungsabfrage begrenzt werden, um die Zeichenfolge zu bilden, für die anschließend der Hashwert berechnet wird.The colon (:) should not be used as part of the data that is used to correlate the message because it is already used to delimit the message query’s key and value to form the string that is subsequently hashed. Wenn Persistenz verwendet wird, stellen Sie sicher, dass die aktuellen identifizierenden Daten nicht von einer zuvor beibehaltenen Instanz verwendet wurden.If persistence is being used, make sure that the current identifying data has not been used by a previously persisted instance. Die vorübergehende Deaktivierung der Persistenz kann dabei helfen, das Problem zu identifizieren.Temporarily disabling persistence can help identify this issue. Mit der WCF-Ablaufverfolgung kann der berechnete Korrelationsschlüssel angezeigt werden. Sie ist außerdem hilfreich beim Debuggen von Problemen dieser Art.WCF tracing can be used to view the calculated correlation key and is useful for debugging this kind of issue.

RacebedingungenRace Conditions

Es gibt eine kleine zeitliche Lücke zwischen dem Zeitpunkt, zu dem der Dienst die Meldung empfängt, und der eigentlichen Initialisierung der Korrelation. In dieser Zeitspanne werden weitere Meldungen ignoriert.There is a small gap in time between the service receiving a message and the correlation actually being initialized, during which follow-up messages will be ignored. Wenn ein Workflowdienst die inhaltsbasierte Korrelation mit Daten initialisiert, die vom Client über einen unidirektionalen Vorgang gesendet werden, und der Client unmittelbar darauf weitere Meldungen sendet, werden diese Meldungen während des beschriebenen Intervalls ignoriert.If a workflow service initializes the content-based correlation by using data passed from the client over a one-way operation, and the caller sends immediate follow-up messages, these messages will be ignored during this interval. Dies kann vermieden werden, indem die Korrelation mit einem bidirektionalen Vorgang initialisiert wird oder indem ein TransactedReceiveScope verwendet wird.This can be avoided by using a two-way operation to initialize the correlation, or by using a TransactedReceiveScope.

Probleme bei KorrelationsabfragenCorrelation Query Issues

Mit Korrelationsabfragen wird angegeben, welche Daten in einer Meldung verwendet werden, um die Meldung zu korrelieren.Correlation queries are used to specify what data in a message is used to correlate the message. Diese Daten werden mit einer XPath-Abfrage angegeben.This data is specified by using an XPath query. Wenn Nachrichten nicht an einen Dienst weitergeleitet werden, obwohl keine Anzeichen eines Problems ersichtlich sind, können Sie einen Literalwert angeben, der mit dem Wert der Meldungsdaten und nicht mit einer XPath-Abfrage übereinstimmt.If messages to a service are not being dispatched even though everything appears to be correct, one strategy for troubleshooting is to specify a literal value that matches the value of the message data instead of an XPath query. Verwenden Sie die string-Funktion, um einen Literalwert anzugeben.To specify a literal value, use the string function. Im folgenden Beispiel wird ein MessageQuerySet konfiguriert, um den Literalwert 11445 für die OrderId zu verwenden, und die XPath-Abfrage wird auskommentiert.In the following example, a MessageQuerySet is configured to use a literal value of 11445 for the OrderId and the XPath query is commented out.

MessageQuerySet = new MessageQuerySet  
{  
    {  
        "OrderId",   
        //new XPathMessageQuery("sm:body()/tempuri:StartOrderResponse/tempuri:OrderId")  
        new XPathMessageQuery("string('11445')")  
    }  
}  

Wenn eine XPath-Abfrage falsch konfiguriert ist, sodass keine Korrelationsdaten abgerufen werden, wird ein Fehler mit der folgenden Meldung zurückgegeben: „Eine Korrelationsabfrage ergab ein leeres Resultset.If an XPath query is configured incorrectly such that no correlation data is retrieved, a fault is returned with the following message: "A correlation query yielded an empty result set. Stellen Sie sicher, dass die Korrelationsabfragen für den Endpunkt ordnungsgemäß konfiguriert sind."Please ensure correlation queries for the endpoint are correctly configured." Dieser Fehler lässt sich schnell beheben, indem die XPath-Abfrage wie im vorherigen Abschnitt beschrieben durch einen Literalwert ersetzt wird.One quick way to troubleshoot this is to replace the XPath query with a literal value as described in the previous section. Dieses Problem kann auftreten, wenn Sie die XPath-Abfrage-Generator im Verwenden der Korrelationsinitialisierer hinzufügen oder CorrelatesOn-Definition Dialogfelder und der Workflowdienst Nachrichtenverträge verwendet.This issue can occur if you use the XPath query builder in the Add Correlation Initializers or CorrelatesOn Definition dialog boxes and your workflow service uses message contracts. Im folgenden Beispiel wird eine Nachrichtenvertragsklasse definiert.In the following example, a message contract class is defined.

[MessageContract]  
public class AddItemMessage  
{  
    [MessageHeader]  
    public string CartId;  

    [MessageBodyMember]  
    public string Item;  
}  

Dieser Nachrichtenvertrag wird von einer Receive-Aktivität in einem Workflow verwendet.This message contract is used by a Receive activity in a workflow. Die CartId im Header der Nachricht wird zum Korrelieren der Nachricht mit der ordnungsgemäßen Instanz verwendet.The CartId in the header of the message is used to correlate the message to the correct instance. Wenn die XPath-Abfrage zum Abrufen der CartId mit den Korrelationsdialogfeldern im Workflow-Designer erstellt wird, wird die folgende fehlerhafte XPath-Abfrage generiert.If the XPath query that retrieves the CartId is created using the correlation dialogs in the workflow designer, the following incorrect XPath query is generated.

sm:body()/xg0:AddItemMessage/xg0:CartId  

Diese XPath-Abfrage ist ordnungsgemäß, wenn die Receive-Aktivität Parameter für die Daten verwendet. Da sie jedoch einen Nachrichtenvertrag verwendet, ist die Abfrage fehlerhaft.This XPath query would be correct if the Receive activity used parameters for the data, but since it is using a message contract it is incorrect. Die folgende XPath-Abfrage ist die ordnungsgemäße Abfrage zum Abrufen der CartId aus dem Header.The following XPath query is the correct XPath query to retrieve the CartId from the header.

sm:header()/tempuri:CartId  

Dies kann anhand des Nachrichtentexts überprüft werden.This can be confirmed by examining the body of the message.

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">  
  <s:Header>  
    <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/IService/AddItem</Action>  
    <h:CartId xmlns:h="http://tempuri.org/">80c95b41-c98d-4660-a6c1-99412206e54c</h:CartId>  
  </s:Header>  
  <s:Body>  
    <AddItemMessage xmlns="http://tempuri.org/">  
      <Item>Books</Item>  
    </AddItemMessage>  
  </s:Body>  
</s:Envelope>  

Im folgenden Beispiel wird eine für einen Receive-Vorgang konfigurierte AddItem-Aktivität gezeigt, die Daten mithilfe des vorherigen Nachrichtenvertrags empfängt.The following example shows a Receive activity configured for an AddItem operation that uses the previous message contract to receive data. Die XPath-Abfrage ist ordnungsgemäß konfiguriert.The XPath query is correctly configured.

<Receive CorrelatesWith="[CCHandle] OperationName="AddItem" ServiceContractName="p:IService">  
  <Receive.CorrelatesOn>  
    <XPathMessageQuery x:Key="key1">  
      <XPathMessageQuery.Namespaces>  
        <ssx:XPathMessageContextMarkup>  
          <x:String x:Key="xg0">http://schemas.datacontract.org/2004/07/MessageContractWFService</x:String>  
        </ssx:XPathMessageContextMarkup>  
      </XPathMessageQuery.Namespaces>sm:header()/tempuri:CartId</XPathMessageQuery>  
  </Receive.CorrelatesOn>  
  <ReceiveMessageContent DeclaredMessageType="m:AddItemMessage">  
    <p1:OutArgument x:TypeArguments="m:AddItemMessage">[AddItemMessage]</p1:OutArgument>  
  </ReceiveMessageContent>  
</Receive>  

Weitere Informationen zu einer Inhaltsbasierter Korrelation, finden Sie unter Inhaltsbasierter und korrelierter Rechner Beispiel.For more information about content-based correlation, see Content Based and the Correlated Calculator sample.