使用新版本程序集加载先前的版本工作流程

10

我正在尝试找出一种方法来升级我们的工作流运行时(自定义活动)使用的程序集,同时仍然能够加载(反序列化)旧实例。 我的情况如下:

  1. 已创建并持久化一个带有 CustomActivities v.1.0.0.0 的工作流实例。
  2. 部署了一个新版本的产品,其中包含 CustomActivities v.2.0.0.0。
  3. 尝试在新运行时中加载以前的工作流。

v.1 和 v.2 之间的区别在于我们在程序集中添加了一些额外的类。现有类型的结构没有改变,因此我认为二进制反序列化仍然可以工作。 我们正在使用 AssemblyResolve 事件将所有类型从 v.1 重定向到 v.2。

if (args.Name.Contains("CustomActivities"))
{
    Type someTypeFromCustomActivities = typeof(WorkflowType);
    return someTypeFromCustomActivities.Assembly;
}

在反序列化过程中,我们的代码遇到了以下异常:

SerializationException: 对象 ID 为 153 的对象实现了 IObjectReference 接口,但其中某些依赖项无法解决。这可能是因为两个相互依赖的 IObjectReference 实例引起的。

什么可能导致这种行为,我们如何解决?如果有人有一种升级工作流的策略,不需要运行旧版本和新版本的程序集(即同一个应用程序域中的旧版本和新版本),那将不胜感激。


这篇博客说: 检查您是否更改了工作流程(例如创建了一些新状态),如果是,请检查您的持久性数据库中是否有任何已持久化的工作流程。如果有,您的问题可能在那里,因为工作流程无法再次序列化。@AZ 这可能是您的情况吗?http://brazeta.wordpress.com/2012/01/12/vs-2010-test-assert-inconclusive-exception/ - sethcall
1
类/工作流结构没有改变。另外,我不能仅仅删除持久化数据,因为那意味着我会失去活跃的生产工作流程。 - Adrian Zanescu
1个回答

2

程序集解析事件对于更改序列化类型的程序集引用没有任何作用。您是否尝试在机器级别上使用程序集绑定重定向从v1到v2。

更新:我找到了这个链接,讲述了如何使用绑定重定向将旧工作流程转发到新版本,使用appliesTo属性。

http://msdn.microsoft.com/en-us/library/aa349375.aspx


程序集解析处理与配置重定向具有完全相同的效果。理论上,旧数据应该与新类型匹配,因为它们的结构没有改变,但是工作流运行时仍然会出现上述异常。我正在尝试从之前遇到此问题并想出解决方案的人那里获得一些建议。 - Adrian Zanescu
  1. 不是一个答案。虽然这可能是一个不错的评论。
- Adrian Zanescu
我在机场用手机写这篇文章,因此很抱歉篇幅短小、表述不够清晰,并且答案放错位置了。 - Steve Mitcham
无需道歉。感谢您抽出时间查看问题。-1已撤回 :) - Adrian Zanescu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接