使用SqlWorkflowPersistenceService& SF时,WF上有一个奇怪的例外。 SqlTrackingService

时间:2009-08-26 11:17:50

标签: c# .net workflow-foundation

我正在运行一个包含SqlWorkflowPersistenceService&的工作流运行时。 SqlTrackingService(IsTransactional = true)

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

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

我得到的错误是:

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()

如果我没有添加SqlTrackingService或将其设置为“IsTransactional”为true,那么一切正常


编辑:仅在使用远程数据库时才会出现此错误。如果从数据库计算机执行它,则完全相同的代码将起作用。

2 个答案:

答案 0 :(得分:1)

之前我没有看到过这个错误,但可能有助于调试的是IsTransactional设置。这个名称有点误导,实际上意味着批量更新到tyhe数据库,直到达到持久性点。当调用UnLoad()时,这是一个持久性点,并且IsTransactional = true,所有跟踪记录都将被保留。当IsTransactional = false时,它们会在创建后立即保留。

可能涉及的是DTC。即使您使用相同的数据库进行跟踪和持久化,也会打开多个连接,从而导致分布式事务,除非您使用的是SharedConnectionWorkflowCommitWorkBatchService。

答案 1 :(得分:1)

问题解决了。

SharedConnectionWorkflowCommitWorkBatchService不是答案。 使用它只是部分解决方案,因为:

  1. 只有当你的持久性&跟踪服务位于同一个数据库中。
  2. 您将无法在事务中提升事务(例如,在事务范围内更新数据库记录)。它会抛出异常。

  3. 真正的问题 - DTC被禁用
    从Windows XP SP2开始,默认情况下禁用 MSDTC (Microsoft分布式事务处理协调器)的网络访问。

    如何修复 - 为MSDTC启用网络访问:

    1. 开始菜单 - >程序 - >管理工具 - >组件服务
    2. 控制台根目录 - >组件服务 - >计算机 - >我的电脑 - >右键单击它并选择“属性”。
    3. 选择MSDTC,然后单击安全配置。
    4. 启用“网络DTC访问”,“允许远程客户端”,“允许远程管理”,“允许入站”,“允许出站”,“启用提示事务”和“启用XA事务”。
    5. 确认所有更改并关闭窗口。
    6. 如果您运行Windows防火墙,则应该打开MSDTC的例外。转到“控制面板” - > “安全中心” - > “Windows防火墙” - > “例外” - > “添加程序” - > “浏览”并选择“C:\ WINDOWS \ system32 \ msdtc.exe”。确认所有更改。