【问题标题】:Windows Workflow 4.5 Delay Activity Not PersistingWindows Workflow 4.5 延迟活动不持久
【发布时间】:2017-02-03 13:51:29
【问题描述】:

我正在为工作开发一个 WF4.5 服务,它在工作流中使用延迟活动。工作流托管在 AppFabric 中(在 Visual Studio 中进行本地测试)。我在服务中有我的 web.config 设置,并且 AppFabric 设置为使用自定义配置。这是工作流相关部分的图片:

从图像中得到的要点是延迟之前的活动(确定通信)确实运行,并且我有可验证的证据。我也知道延迟活动后的 UpdateRejectionInfo 不会运行(在运行工作流时使用自定义活动中的断点进行验证)。

我尝试在DetermineCommunication 活动和延迟活动之间添加一个持久活动,它确实保存到我正在查找的数据库中,所以我知道该服务具有对数据库的写入权限。

这里也是服务的 web.config 的行为部分:

<behaviors>
  <serviceBehaviors>
    <behavior>
      <sqlWorkflowInstanceStore
        connectionString="SERVER=hq-sql02\oculusdev;Database=EAA;Trusted_Connection=yes"
        hostLockRenewalPeriod="00:00:30"
        runnableInstancesDetectionPeriod="00:00:30"
        instanceCompletionAction="DeleteNothing"
        instanceLockedExceptionAction="AggressiveRetry"
        instanceEncodingOption="GZip"/>
      <workflowIdle timeToPersist="00:00:20" timeToUnload="00:00:30"/>
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>

任何形式的帮助都会令人惊叹。

【问题讨论】:

    标签: c# .net persistence delay workflow-foundation-4


    【解决方案1】:

    好的。所以这个问题的答案远远超出了延迟活动,还涉及到我正在使用的其他技术,我什至没有提到。

    TL;DR: 我没有设置我的实体框架对象来禁用延迟加载。所以在序列化数据时,抛出了一个我从未见过的异常​​,它会导致工作流崩溃。

    长版: 将数据持久化到数据库时,程序会尝试序列化工作流范围内的所有对象。这对于标准 C# 对象来说是正常的,但是当它们成为复杂对象时,序列化变得更加复杂。

    为了便于技术,我在我的项目中使用实体框架(数据库优先)来传递和保存数据库实体。当 Entity Framework 实体被序列化时,它们会尝试获取所有可用的信息。好吧,Entity Framework 有这种延迟加载数据的想法,所以如果你从数据库中获取一个实体,并且你希望获得更深的一层(即通过外键关系),它将返回并查询数据库以获取该信息.从数据库中获取实体的一种常见方法是获取实体,然后通过使用短期使用块来切断数据库连接。

    如果您决定使用短期 using blocks(我喜欢称之为单例实体),并且您没有关闭延迟加载,那么当程序尝试序列化实体时,它将开始请求所有初始请求中未获取的额外数据。如果该 using 块已退出,则数据库连接将不可用并抛出异常。

    我没有捕获内置 Activity 抛出的异常,因此它看起来并不像它实际上失败了。

    【讨论】:

      猜你喜欢
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-21
      相关资源
      最近更新 更多