Windows 工作流 4.5 延迟 Activity 不持久

Windows Workflow 4.5 Delay Activity Not Persisting

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

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

我已经尝试在 DetermineCommunication activity 和延迟 activity 之间添加一个 persist activity 并且它确实保存到我正在查找的数据库中,所以我知道该服务对数据库有写入权限。

这里也是 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>

任何形式的帮助都会很棒。

好的。所以这个问题的答案远远超出了延迟 activity 并且进入了我正在使用的我什至没有提到的其他技术。

长话短说;博士: 我没有将 entity framework 对象设置为禁用延迟加载。因此,在序列化数据时,抛出了一个我从未见过的异常​​,它会使工作流崩溃。

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

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

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

我没有捕获 built-in 活动抛出的异常,因此它看起来不像是在失败,而实际上是在失败。