2009-08-26 3 views
0

Je suis en cours d'exécution d'une exécution de workflow qui contient un SqlWorkflowPersistenceService & SqlTrackingService (avec IsTransactional = true)Une exception étrange WF lors de l'utilisation SqlWorkflowPersistenceService & SqlTrackingService

WorkflowInstance workflowInstance = _workflowRuntime.CreateWorkflow(workflowType); 
workflowInstance.Start(); 

// Assure persistence 
workflowInstance.Unload(); // Error occur here 
workflowInstance.Load(); 

L'erreur que je reçois est:

PersistenceException "Cannot access a disposed object.\r\nObject name: 'Transaction'." 
    at System.Workflow.Runtime.WorkflowExecutor.Persist(Activity dynamicActivity, Boolean unlock, Boolean needsCompensation) 
    at System.Workflow.Runtime.WorkflowExecutor.PerformUnloading(Boolean handleExceptions) 
    at System.Workflow.Runtime.WorkflowExecutor.Unload() 
    at System.Workflow.Runtime.WorkflowInstance.Unload() 

Tout fonctionne très bien si je ne suis pas d'ajouter le SqlTrackingService ou le réglage il est « IsTransactional » true


Édition: Cette erreur se produit uniquement lors de l'utilisation d'une base de données distante. Le même code exact fonctionnera si vous l'exécutez à partir de l'ordinateur de base de données.

Répondre

1

Problème résolu.

SharedConnectionWorkflowCommitWorkBatchService n'était pas la solution. Son utilisation est qu'une solution partielle parce que:

  1. Il ne fonctionnera que si vos deux persistance & services de suivi sont sur la même base de données.
  2. Vous ne serez pas en mesure de promouvoir une transaction dans une transaction (par exemple, mettez à jour vos enregistrements de base de données au cours d'une transaction). Il va lancer une exception.

Le vrai problème - DTC a été désactivé
A partir de Windows XP SP2, l'accès au réseau pour MSDTC (Microsoft Distributed Transaction Coordinator) est désactivée par défaut.

Comment réparer - permettre l'accès au réseau pour MSDTC:

  1. Menu Démarrer -> Programmes -> Outils d'administration -> Services de composants
  2. Racine de la console -> Services de composants -> Informatique -> Poste de travail -> faites un clic droit dessus et sélectionnez Propriétés.
  3. Choisissez MSDTC et cliquez sur Configuration de la sécurité.
  4. Activez «Accès DTC réseau», «Autoriser les clients distants», «Autoriser l'administration à distance», «Autoriser les appels entrants», «Autoriser les transactions sortantes», «Activer les transactions TIP» et «Activer les transactions XA».
  5. Confirmez tous les changements et fermez la fenêtre.
  6. Si vous exécutez le pare-feu Windows, vous devez ouvrir une exception pour le MSDTC. Allez dans "Panneau de configuration" -> "Centre de sécurité" -> "Pare-feu Windows" -> "Exceptions" -> "Ajouter un programme" -> "Parcourir" et sélectionnez "C: \ WINDOWS \ system32 \ msdtc.exe". Confirmez tous les changements.
1

Je n'ai pas vu cette erreur auparavant mais quelque chose qui peut aider dans le débogage est le paramètre IsTransactional. Ce nom est un peu trompeur et signifie vraiment des mises à jour par lots pour tyhe la base de données jusqu'à ce qu'un point de persistance soit atteint. Lorsque le UnLoad() est appelé, il s'agit d'un point de persistance et avec IsTransactional = true, tous les enregistrements de suivi seront conservés. Lorsque IsTransactional = false, ils sont persistés dès qu'ils sont créés.

Quelque chose qui pourrait être impliqué est le DTC. Même si vous utilisez la même base de données pour le suivi et la persistance, plusieurs connexions seront ouvertes résultant en une transaction distribuée sauf si vous utilisez SharedConnectionWorkflowCommitWorkBatchService.

+0

Merci. Cela fonctionne très bien - mais seulement comme une solution de contournement. Le SharedConnectionWorkflowCommitWorkBatchService fonctionnera si les deux services de persistance et de suivi sont sur la même base de données, et je ne veux pas bloquer l'option de les séparer à différents DB. – HuBeZa

Questions connexes