繁体   English   中英

Windows 工作流 4.5 延迟活动不持久

[英]Windows Workflow 4.5 Delay Activity Not Persisting

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

工作流延迟活动

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

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

这里也是该服务的 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>

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

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

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

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

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

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

我没有捕获内置活动抛出的异常,所以它看起来并没有真正失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM