【问题标题】:WF4 WCF Send Message at wrong timeWF4 WCF 在错误的时间发送消息
【发布时间】:2013-02-07 01:58:52
【问题描述】:

我在 IIS 中托管工作流服务 (xamlx)。它有一些接收活动,例如方法 A 和方法 B。我编写了一个 MVC 应用程序作为客户端来调用这些方法。在 PageA 中,用户提交表单会调用 MethodA,工作流会转到等待 MethodB 的 Receive Activity。然后在Page B,用户提交表单会调用MethodB。但是,如果用户在 PageA 中提交,然后返回到 PageA 并再次提交相同的工作流实例,它将等待一分钟并给出超时异常:

请求通道在等待回复后超时 00:01:00。增加传递给 Request 或的调用的超时值 增加 Binding 上的 SendTimeout 值。分配给的时间 此操作可能是较长超时的一部分。

这个错误似乎来自 WCF,而我想它会给出以下错误:

InstancePersistenceCommand 的执行被中断,因为 实例键“guid”未与实例关联。这个可以 发生是因为实例或密钥已被清理,或者因为 密钥无效。如果生成的消息,密钥可能无效 from 在错误的时间发送或包含不正确的相关性 数据。

我有几个问题:

  1. 是否可以设置任何配置,以便可以捕获另一个异常,而不是等待一段时间直到可以捕获超时异常?我知道我们可以在绑定标签中设置一个较小的超时值,但这不应该是一个解决方案。

  2. 当工作流实例未处于正确状态时,是否有任何方法可以避免显示 PageA? (即使这样,我们还需要解决问题1,因为用户可以打开PageA并在提交前空闲一段时间)

谢谢。

【问题讨论】:

    标签: asp.net wcf iis workflow-foundation-4 workflowservice


    【解决方案1】:

    回复:超时异常。

    这是 WF4 中的一个已知错误。这是 WF/WCF 基础结构将尝试传递消息这一事实的结果。这意味着它将在消息上挂起一段时间,然后查看工作流是否进入可以处理消息的状态。基础架构并不真正了解您的工作流程的结构。因此,即使您完全意识到工作流处于一种状态,在给定当前状态的情况下,基础设施将等待它永远无法处理消息。

    Re:避免显示 PageA。

    这实际上取决于 UI 层,超出了工作流程的范围。正如您指出的那样,并非完全可以避免。但是,我在持久存储中使用书签信息取得了很好的成功。每个接收活动都会创建一个具有已知名称的书签,我基本上检查了那里的书签。基于此信息,我将启用/禁用部分 UI。它并不能真正解决用户打开页面并将其保留 15 分钟的问题,因此在调用服务方法时仍然需要一个错误处理程序。一种改进的方法是,暂时假设一个基于 HTML 的 UI,使用 WebSockets,或者更实用的 SignalR,并将工作流状态更改从服务器推送到客户端。仍然不会消除错误处理的需要,但应该使 UI 处于错误状态的窗口更小。

    【讨论】:

    • 感谢您的及时回复。使用 BlockingBookmarks 的想法似乎很有趣。我将尝试实施此解决方法。再次感谢您的建议!
    【解决方案2】:

    由于我遇到了类似的问题,我想提供一些关于Maurice's answer 的超时部分的背景知识。

    该信息来自 Jim Carley 在this Microsoft forum thread 上的一篇帖子。不幸的是,不支持直接链接到帖子——搜索“协议书签”。我将在这里总结重要的部分。

    背景

    • 并非所有书签都是一样的。由 Receive 活动创建的那些(“协议书签”)与“非协议”书签的处理方式不同。
    • Pick 活动在内部创建一个非协议书签以在触发器完成时恢复。
    • 当接收到操作的消息并且没有操作的协议书签时,工作流基础结构会检查工作流实例是否有任何未完成的非协议书签。

      • 如果有,基础架构会挂起消息并可能发生超时。
      • 否则邮件将被立即拒绝。

    底线

    以下活动都会创建内部书签,因此在与接收活动和乱序消息混合时可能会导致超时问题:

    • 选择
    • 状态
    • CompensableActivity(以及相关的 CompensationExtension)
    • 确认
    • 延迟

    对于 Pick,一个潜在的解决方法是使用 Parallel 并将 CompletionCondition 设置为 true

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-13
      • 2013-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多