2015-03-23 3 views
0

J'ai un (joli) workflow simple. Les trois premières actions sur le flux de travail sont:Qu'est-ce qui peut amener WF4 à se plaindre incorrectement des appels hors séquence?

  1. GetWorkflowId (simple étape personnalisée pour récupérer l'ID de workflow)
  2. InitializeCorrelation (vanille)
  3. Recevez Xyz

Il y a 9 reçoit en le flux de travail dans tous. Quand je les passe tous dans mon test d'unité (en utilisant WorkflowServiceTestHost) cela fonctionne très bien.

Cependant, quand je tente d'appeler la première réception entrypoint (xyz) d'un client, je reçois l'erreur suivante:

Operation 'Xyz|{ http://tempuri.org/ }IService' on service instance with identifier 'ffd6c56d-529f-4f42-ba81-f30c5ea9348d' cannot be performed at this time. Please ensure that the operations are performed in the correct order and that the binding in use provides ordered delivery guarantees.

J'ai essayé toutes sortes de choses pour obtenir plus d'informations à ce sujet mais venir vide. J'ai une base de données de persistance SQL Server et l'ai vérifiée pour l'instance de workflow, mais le InstancesTable est toujours vide. Je commence à me demander si j'ai rencontré un bug dans WF4.

Répondre

0

L'erreur affichée était fausse et trompeuse. La vraie erreur était

System.NotSupportedException: Expression Activity type 'CSharpValue`1' requires compilation in order to run. Please ensure that the workflow has been compiled.

que j'ai trouvé quand je WF a permis le suivi (voir link). En regardant des questions connexes XAMLX Workflow with c# expressions et Activity throws exception when C# expression uses reference types j'ai réalisé que depuis que je l'avais WorkflowServiceHostFactory que je substituée devais maintenant compiler explicitement les expressions C#. Ce faisant, dans le remplacement a corrigé le problème.

Les résultats ressemblent à ceci:

public override ServiceHostBase CreateServiceHost(string constructorString, Uri[] baseAddresses) 
{ 
    var result = new WorkflowServiceHostFactory().CreateServiceHost(constructorString, baseAddresses) as WorkflowServiceHost; 
    WorkflowUtilities.CompileExpressions(result.Activity); 
    return result; 
} 

WorkflowUtilities est la classe dans laquelle je mets le code collé-de-ailleurs pour faire les compilations d'expression.