Kontextaustausch
Dieses Thema gilt für Windows Workflow Foundation 4.
Die Kontextkorrelation basiert auf dem Kontextaustauschmechanismus, der unter .NET Context Exchange Protocol Specification (möglicherweise in englischer Sprache) beschrieben wird. Bei der Kontextkorrelation wird ein bekannter Kontextheader oder ein Cookie verwendet, um Nachrichten der richtigen Instanz zuzuordnen. Zur Durchführung der Kontextkorrelation muss eine kontextbasierte Bindung wie BasicHttpContextBinding, WSHttpContextBinding oder NetTcpContextBinding auf dem Endpunkt verwendet werden, der für WorkflowServiceHost bereitgestellt wird. In diesem Thema wird erläutert, wie die Kontextkorrelation mit Messagingaktivitäten in einem Workflowdienst verwendet wird.
Verwenden der Kontextkorrelation
Die Kontextkorrelation wird verwendet, wenn ein Client häufig Aufrufe an einen Workflowdienst durchführen muss und der Dienst mit einer der Kontextbindungen gehostet wird. Dieser Typ der Korrelation wird von einem Receive/SendReply-Paar im Workflowdienst initialisiert. Der Kontext wird zusammen mit der Antwort an den Client zurückgesendet, und der Client fügt diesen Kontext dann an nachfolgende Aufrufen des Diensts an.
Konfigurieren der Kontextkorrelation in einem Workflowdienst
Die Kontextkorrelation wird mit einem ContextCorrelationInitializer initialisiert, der der SendReply-Aktivität zugeordnet ist. Diese Aktivität antwortet auf die ursprüngliche eingehende Nachricht. Im folgenden Beispiel wird SendReply konfiguriert, um eine Kontextkorrelation zu initialisieren.
Variable<string> Item = new Variable<string>();
Variable<CorrelationHandle> OrderHandle = new Variable<CorrelationHandle>();
Receive StartOrder = new Receive
{
CanCreateInstance = true,
ServiceContractName = "IOrderService",
OperationName = "StartOrder"
};
SendReply ReplyToStartOrder = new SendReply
{
Request = StartOrder,
CorrelationInitializers =
{
new ContextCorrelationInitializer
{
CorrelationHandle = OrderHandle
}
}
};
Hinweis: |
---|
Beachten Sie, dass das Receive/SendReply-Paar die standardmäßige Anforderung-Antwort-Korrelation verwendet, die über die implizite CorrelationHandle-Verwaltung WorkflowServiceHost bereitgestellt wird. Weitere Informationen finden Sie unter Anforderung-Antwort. |
In den nachfolgenden Receive-Aktivitäten im Workflowdienst können auf das CorrelationHandle-Objekt verweisen, das im vorherigen Beispiel von SendReply initialisiert wurde.
Receive AddItem = new Receive
{
ServiceContractName = "IOrderService",
OperationName = "AddItem",
CorrelatesWith = OrderHandle
};
Der Endpunkt wird dann auf dem WorkflowServiceHost konfiguriert, um eine kontextbasierte Bindung zu verwenden, z. B. BasicHttpContextBinding.
<endpoint
contract=”IOrderContract”
binding = “basicHttpContextBinding”
address=”https://localhost:8080/OrderService” />
Konfigurieren der Kontextkorrelation in einem Workflowclient
Wenn der Client ein anderer Workflow ist, muss die Kontextkorrelation auch auf dem Client konfiguriert werden. Im Clientworkflow muss das ReceiveReply-Objekt des Send/ReceiveReply-Paars, das den ursprünglichen Aufruf an den Workflowdienst durchführt, mit einem ContextCorrelationInitializer konfiguriert werden.
Variable<CorrelationHandle> cchandle = new Variable<CorrelationHandle>();
Send request = new Send
{
// Activity configuration omitted.
};
ReceiveReply reply = new ReceiveReply
{
Request = request,
CorrelationInitializers =
{
new ContextCorrelationInitializer
{
CorrelationHandle = cchandle
}
}
};
Nachdem die Korrelation initialisiert wurde, können nachfolgende Send-Aktivitäten das CorrelationHandle-Objekt verwenden, um Methoden auf der gleichen Dienstinstanz aufzurufen.
Send request2 = new Send
{
CorrelatesWith = cchandle,
// Remaining activity configuration omitted.
};
Beachten Sie, dass die Kontextkorrelation in diesen Beispielen explizit konfiguriert wurde. Wenn der Clientworkflow nicht auch in einem WorkflowServiceHost-Objekt gehostet wird, muss die Korrelation explizit konfiguriert werden, es sei denn, die Aktivitäten sind in einer CorrelationScope-Aktivität enthalten.
Wenn der Client, der die Aufrufe an den Workflowdienst durchführt, kein Workflow ist, kann er trotzdem wiederholte Aufrufe ausführen. Es muss nur gewährleistet sein, dass er den explizit den Kontext übergibt, den der erste Aufruf an den Workflowdienst zurückgibt. Proxys, die durch das Hinzufügen eines Dienstverweises in Visual Studio 2010 generiert werden, speichern und übergeben diesen Kontext standardmäßig.