Risoluzione dei problemi relativi alla correlazioneTroubleshooting Correlation

La correlazione viene utilizzata per correlare i messaggi del servizio flusso di lavoro l'uno all'altro e all'istanza del flusso di lavoro corretta, ma se non viene configurata correttamente, i messaggi non verranno ricevuti e le applicazioni non funzioneranno in modo appropriato.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. In questo argomento viene fornita una panoramica dei metodi che consentono di risolvere i problemi relativi alla correlazione e vengono inoltre descritti alcuni dei problemi comuni che possono verificarsi durante l'utilizzo della correlazione.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.

Gestire l'evento UnknownMessageReceivedHandle the UnknownMessageReceived Event

L'evento UnknownMessageReceived si verifica quando un messaggio sconosciuto viene ricevuto da un servizio, inclusi i messaggi che non possono essere correlati a un'istanza esistente.The UnknownMessageReceived event occurs when an unknown message is received by a service, including messages that cannot be correlated to an existing instance. Per i servizi indipendenti, questo evento può essere gestito nell'applicazione host.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);  
};  

Per i servizi ospitati sul Web, questo evento può essere gestito derivando una classe da WorkflowServiceHostFactory ed eseguendo l'override del metodo CreateWorkflowServiceHost.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;  
    }  
}  

Questo oggetto WorkflowServiceHostFactory personalizzato può essere quindi specificato nel file svc per il servizio.This custom WorkflowServiceHostFactory can then be specified in the svc file for the service.

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

Il richiamo di questo gestore consente di recuperare il messaggio tramite la proprietà Message di UnknownMessageReceivedEventArgs e sarà simile al messaggio seguente: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>  

L'ispezione dei messaggi inviati al gestore UnknownMessageReceived può fornire indicazioni sui motivi della mancata correlazione del messaggio a un'istanza del servizio flusso di lavoro.Inspecting messages dispatched to the UnknownMessageReceived handler may provide clues about why the message did not correlate to an instance of the workflow service.

Utilizzare il rilevamento per monitorare lo stato di avanzamento del flusso di lavoroUse Tracking to Monitor the Progress of the Workflow

Il rilevamento consente di monitorare lo stato di avanzamento del flusso di lavoro.Tracking provides a way to monitor the progress of a workflow. Per impostazione predefinita, vengono generati record di rilevamento per eventi del ciclo di vita di flusso del lavoro, eventi del ciclo di vita delle attività, propagazione degli errori e ripresa dei segnalibri.By default, tracking records are emitted for workflow life-cycle events, activity life-cycle events, fault propagation, and bookmark resumption. Record di rilevamento personalizzati possono inoltre essere generati da attività personalizzate.Additionally, custom tracking records can be emitted by custom activities. Durante la risoluzione dei problemi relativi alla correlazione, i record di rilevamento delle attività, di ripresa dei segnalibri e di propagazione degli errori costituiscono gli elementi più utili.When troubleshooting correlation, the activity tracking records, the bookmark resumption records, and the fault propagation records are the most useful. I record di rilevamento delle attività possono essere utilizzati per determinare lo stato di avanzamento corrente del flusso di lavoro e consentono di identificare l'attività di messaggistica attualmente in attesa dei messaggi.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. I record di ripresa dei segnalibri sono utili perché indicano la ricezione di un messaggio da parte del flusso di lavoro, mentre i record di propagazione degli errori rendono disponibile un record degli errori presenti nel flusso di lavoro.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. Per abilitare il rilevamento, specificare l'oggetto TrackingParticipant desiderato nella proprietà WorkflowExtensions di WorkflowServiceHost.To enable tracking, specify the desired TrackingParticipant in the WorkflowExtensions of the WorkflowServiceHost. Nell'esempio seguente, il ConsoleTrackingParticipant (dal rilevamento personalizzato esempio) viene configurato utilizzando il profilo di rilevamento predefinito.In the following example, the ConsoleTrackingParticipant (from the Custom Tracking sample) is configured by using the default tracking profile.

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

Un partecipante del rilevamento, quale ConsoleTrackingParticipant, è utile per i servizi flusso di lavoro indipendenti che dispongono di una finestra della console.A tracking participant such as the ConsoleTrackingParticipant is useful for self-hosted workflow services that have a console window. Per un servizio ospitato sul Web, deve essere utilizzato un partecipante del rilevamento che registra le informazioni di rilevamento in un archivio durevole, ad esempio predefinito EtwTrackingParticipant, o un partecipante del rilevamento personalizzato che registra le informazioni in un file, ad esempio il TextWriterTrackingParticpant dal Rilevamento tramite un File di testo esempio.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.

Per ulteriori informazioni sulla registrazione e configurazione del rilevamento per un servizio del flusso di lavoro ospitato sul Web, vedere flusso di lavoro rilevamento e traccia, configurazione del rilevamento per un flusso di lavoroe il Rilevamento [esempi WF] esempi.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.

Utilizzare la funzionalità di traccia di WCFUse WCF Tracing

La funzionalità di traccia di WCF consente di tracciare il flusso di messaggi da e verso un servizio flusso di lavoro.WCF tracing provides tracing of the flow of messages to and from a workflow service. Queste informazioni di traccia sono utili per risolvere i problemi relativi alla correlazione, in particolare per la correlazione basata sul contenuto.This tracing information is useful when troubleshooting correlation issues, especially for content-based correlation. Per abilitare la traccia, specificare i listener di traccia desiderati nella sezione system.diagnostics del file web.config se il servizio flusso di lavoro è ospitato sul Web oppure nel file app.config se il servizio flusso di lavoro è indipendente.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. Per includere il contenuto dei messaggi nel file di traccia, specificare true per logEntireMessage nell'elemento messageLogging nella sezione diagnostics di system.serviceModel.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. Nell'esempio seguente le informazioni di analisi, incluso il contenuto dei messaggi, sono configurate in modo da essere scritte in un file denominato service.svclog.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>  

Per visualizzare le informazioni contenute in service.svclog, strumento Visualizzatore di tracce dei servizi (SvcTraceViewer.exe) viene utilizzato.To view the trace information that is contained in service.svclog, the Service Trace Viewer Tool (SvcTraceViewer.exe) is used. Questa soluzione è particolarmente utile per risolvere i problemi relativi alla correlazione basata sul contenuto, in quanto consente di visualizzare il contenuto del messaggio e di vedere esattamente ciò che viene passato, nonché di determinarne la corrispondenza a CorrelationQuery per la correlazione basata sul contenuto.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. Per ulteriori informazioni sulla traccia di WCF, vedere strumento Service Trace Viewer (SvcTraceViewer.exe), configurazione di traccia, e utilizzando la funzionalità di traccia per risolvere i problemi dell'applicazione.For more information about WCF tracing, see Service Trace Viewer Tool (SvcTraceViewer.exe), Configuring Tracing, and Using Tracing to Troubleshoot Your Application.

Problemi comuni relativi alla correlazione di scambio del contestoCommon Context Exchange Correlation Issues

Per determinati tipi di correlazione, è necessario che venga associato un tipo specifico di associazione affinché la correlazione funzioni correttamente.Certain types of correlation require that a specific type of binding is used for the correlation to work correctly. Alcuni esempi includono la correlazione request/reply che richiede un'associazione bidirezionale, quale BasicHttpBinding, e la correlazione di scambio del contesto per la quale è necessaria un'associazione basata sul contesto, quale BasicHttpContextBinding.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. La maggior parte delle associazioni supporta operazioni bidirezionali, pertanto questo non rappresenta un problema comune per la correlazione request/reply, mentre è disponibile solo un numero limitato di associazioni basate sul contesto, tra cui BasicHttpContextBinding, WSHttpContextBinding e 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. Se non viene utilizzata una di queste associazioni, la chiamata iniziale a un servizio flusso di lavoro avrà esito positivo, ma le chiamate successive non riusciranno generando l'oggetto FaultException.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.  

Le informazioni sul contesto utilizzate per la correlazione del contesto possono essere restituite da SendReply all'attività Receive che inizializza la correlazione del contesto in caso di utilizzo di un'operazione bidirezionale oppure essere specificate dal chiamante se l'operazione è unidirezionale.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. Se il contesto non viene inviato dal chiamante o non viene restituito dal servizio flusso di lavoro, verrà restituito lo stesso oggetto FaultException descritto in precedenza quando viene richiamata un'operazione successiva.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.

Per altre informazioni, vedere lo scambio del contesto.For more information, see Context Exchange.

Problemi comuni relativi alla correlazione request/replyCommon Request-Reply Correlation Issues

Correlazione request / reply viene usata con un Receive / SendReply coppia per implementare un'operazione bidirezionale in un servizio flusso di lavoro e con un Send / ReceiveReply coppia che richiama un'operazione bidirezionale in un altro Web servizio.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. Quando si richiama un'operazione bidirezionale in un servizio WCF, il servizio può essere un tradizionale imperativo servizio WCF basato su codice oppure può essere un servizio flusso di lavoro.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. Per utilizzare la correlazione request/reply, è necessario utilizzare un'associazione bidirezionale, ad esempio BasicHttpBinding, e che le operazioni siano bidirezionali.To use request-reply correlation a two-way binding must be used, such as BasicHttpBinding, and the operations must be two-way.

Se il servizio del flusso di lavoro presenta operazioni bidirezionali in parallelo o la sovrapposizione Receive / SendReply o Send / ReceiveReply gestione coppie, quindi la correlazione implicita fornita da WorkflowServiceHostpotrebbe non essere sufficiente, specialmente negli scenari di carichi di lavoro elevati, e i messaggi non possono essere indirizzati correttamente.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. Per evitare che si verifichi questo problema, è consigliabile specificare sempre in modo esplicito un CorrelationHandle quando si utilizza la correlazione request/reply.To prevent this issue from occurring, we recommend that you always explicitly specify a CorrelationHandle when using request-reply correlation. Quando si utilizza il SendAndReceiveReply e ReceiveAndSendReply modelli dalla sezione della messaggistica il della casella degli strumenti nella finestra di progettazione del flusso di lavoro, un CorrelationHandle è configurato in modo esplicito per impostazione predefinita.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. Durante la compilazione di un flusso di lavoro tramite codice, l'oggetto CorrelationHandle viene specificato nella proprietà CorrelationInitializers della prima attività nella coppia.When building a workflow by using code, the CorrelationHandle is specified in the CorrelationInitializers of the first activity in the pair. Nell'esempio seguente un'attività Receive viene configurata con una proprietà CorrelationHandle esplicita specificata in RequestReplyCorrelationInitializer.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.  

Persistenza non è consentita tra un Receive / SendReply coppia o Send / ReceiveReply coppia.Persistence is not permitted between a Receive/SendReply pair or a Send/ReceiveReply pair. Viene creata un'area di non persistenza che dura fino a quando non vengono completate entrambe le attività.A no-persist zone is created that lasts until both activities have completed. Se un'attività, ad esempio un'attività di ritardo si trova in quest'area di non persistenza e determina che il flusso di lavoro diventi inattivo, tale flusso di lavoro non verrà conservato anche se l'host è configurato per rendere persistenti i flussi di lavoro quando diventano inattivi.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. Se un'attività, ad esempio un'attività Persist tenta di eseguire la persistenza in modo esplicito nell'area di non persistenza, viene generata un'eccezione irreversibile, il flusso di lavoro viene interrotto e al chiamante viene restituita un'eccezione FaultException.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. Il messaggio di eccezione irreversibile è "System.InvalidOperationException: blocchi di non persistenza non in grado di contenere le attività Persist".The fatal exception message is "System.InvalidOperationException: Persist activities cannot be contained within no persistence blocks.". Questa eccezione non viene restituita al chiamante ma può essere osservata se il rilevamento è abilitato.This exception is not returned to the caller but can be observed if tracking is enabled. Il messaggio dell'eccezione FaultException restituita al chiamante è "WorkflowInstance '5836145b-7da2-49d0-a052-a49162adeab6' è stata completata. Impossibile eseguire l'operazione".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".

Per ulteriori informazioni sulla correlazione request/reply, vedere Request/Reply.For more information about request-reply correlation, see Request-Reply.

Problemi comuni relativi alla correlazione di contenutoCommon Content Correlation Issues

La correlazione basata sul contenuto viene utilizzata quando un servizio flusso di lavoro riceve più messaggi e una parte dei dati inclusi nei messaggi scambiati identifica l'istanza desiderata.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. La correlazione basata sul contenuto utilizza questi dati nel messaggio, ad esempio un numero cliente o un ID dell'ordine, per indirizzare messaggi all'istanza del flusso di lavoro corretta.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. Contenuto della sezione vengono descritti alcuni problemi comuni che possono verificarsi durante l'utilizzo della correlazione basata sul contenuto.This section describes several common issues that may occur when using content-based correlation.

Assicurarsi che i dati di identificazione siano univociEnsure the Identifying Data Is Unique

Per i dati usati per l'identificazione dell'istanza viene generato un hash in una chiave di correlazione.The data that is used to identify the instance is hashed into a correlation key. È necessario verificare che i dati utilizzati per la correlazione siano univoci. In caso contrario, potrebbero verificarsi conflitti nella chiave con hash ed è possibile che i messaggi vengano indirizzati in modo errato.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. Una correlazione basata esclusivamente su un nome di cliente può ad esempio generare un conflitto, poiché possono esistere più clienti con lo stesso nome.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. Non utilizzare i due punti (:) come parte dei dati utilizzati per correlare il messaggio, in quanto vengono già utilizzati per delimitare il valore e la chiave della query del messaggio per formattare la stringa per la quale verrà generato un hash.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. Se si utilizza la persistenza, verificare che i dati di identificazione correnti non siano stati utilizzati da un'istanza persistente precedente.If persistence is being used, make sure that the current identifying data has not been used by a previously persisted instance. La disabilitazione temporanea della persistenza può contribuire a identificare il problema.Temporarily disabling persistence can help identify this issue. La funzionalità di traccia di WCF può essere utilizzata per visualizzare la chiave di correlazione calcolata ed essere utile per eseguire il debug di questo tipo di problema.WCF tracing can be used to view the calculated correlation key and is useful for debugging this kind of issue.

Condizioni di tracciaRace Conditions

Tra la ricezione di un messaggio da parte del servizio e il momento in cui la correlazione viene effettivamente inizializzata si verifica un breve intervallo, durante il quale i messaggi seguenti verranno ignorati.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. Se un servizio flusso di lavoro inizializza la correlazione basata sul contenuto tramite dati passati dal client su un'operazione unidirezionale e il chiamante invia immediatamente messaggi successivi, questi messaggi verranno ignorati durante questo intervallo.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. È possibile evitare questo problema utilizzando un'operazione bidirezionale per inizializzare la correlazione o un oggetto TransactedReceiveScope.This can be avoided by using a two-way operation to initialize the correlation, or by using a TransactedReceiveScope.

Problemi relativi alle query di correlazioneCorrelation Query Issues

Le query di correlazione consentono di specificare i dati di un messaggio da utilizzare per la correlazione del messaggio stesso.Correlation queries are used to specify what data in a message is used to correlate the message. Questi dati vengono specificati tramite una query XPath.This data is specified by using an XPath query. Se a un servizio non vengono inviati messaggi anche se tutto sembra corretto, una strategia per la risoluzione dei problemi consiste nel specificare un valore letterale corrispondente al valore dei dati del messaggio anziché una query XPath.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. Per specificare un valore letterale, utilizzare la funzione string.To specify a literal value, use the string function. Nell'esempio seguente viene configurato un oggetto MessageQuerySet per l'utilizzo del valore letterale 11445 per OrderId e la query XPath viene impostata come commento.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')")  
    }  
}  

Se una query XPath non è configurata correttamente in modo tale che non viene recuperato alcun dato di correlazione, viene restituito un errore con il messaggio seguente: "Una query di correlazione ha restituito un set di risultati vuoto.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. Assicurarsi che le query di correlazione dell'endpoint siano configurate correttamente".Please ensure correlation queries for the endpoint are correctly configured." Un metodo rapido per risolvere questo problema consiste nel sostituire la query XPath con un valore letterale come descritto nella sezione precedente.One quick way to troubleshoot this is to replace the XPath query with a literal value as described in the previous section. Questo problema può verificarsi se si utilizza il generatore di query XPath nel Aggiungi inizializzatori di correlazione o definizione di CorrelatesOn finestre di dialogo e il servizio del flusso di lavoro utilizza contratti di messaggio.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. Nell'esempio seguente viene definita una classe dei contratto di messaggio.In the following example, a message contract class is defined.

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

    [MessageBodyMember]  
    public string Item;  
}  

Questo contratto di messaggio viene utilizzato da un'attività Receive in un flusso di lavoro.This message contract is used by a Receive activity in a workflow. Il CartId nell'intestazione del messaggio viene utilizzato per correlare il messaggio all'istanza corretta.The CartId in the header of the message is used to correlate the message to the correct instance. Se la query XPath che recupera il CartId viene creata utilizzando le finestre di dialogo di correlazione nella finestra di progettazione del flusso di lavoro, viene generata la seguente query XPath errata.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  

Questa query XPath sarebbe corretta se l'attività Receive utilizzasse i parametri relativi ai dati, ma dal momento che utilizza un contratto di messaggio, non è corretta.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. La seguenti query XPath è la query XPath corretta per recuperare il CartId dall'intestazione.The following XPath query is the correct XPath query to retrieve the CartId from the header.

sm:header()/tempuri:CartId  

Questo può essere confermato esaminando il corpo del messaggio.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>  

Nell'esempio riportato di seguito viene illustrata un'attività Receive configurata per un'operazione AddItem che utilizza il contratto di messaggio precedente per ricevere i dati.The following example shows a Receive activity configured for an AddItem operation that uses the previous message contract to receive data. La query XPath è configurata correttamente.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>  

Per ulteriori informazioni sulla correlazione basata sul contenuto, vedere in base al contenuto e il calcolatrice correlata esempio.For more information about content-based correlation, see Content Based and the Correlated Calculator sample.