.NET WF加载并运行现有的旧工作流程实例,但具有新的DataContract定义

时间:2018-10-16 12:55:23

标签: .net workflow-foundation

我有一个旧的工作流程(现在保留了许多实例),并且这个旧的工作流程使用/引用了如下定义的实体(Entity.dll): (版本1)

[Serializable]
[DataContract]
public class MyClass
{...}

现在我升级到新版本,而MyClass变成了(版本2)

[Serializable]
[DataContract(Namespace = "http://foo.com/")]
public class MyClass
{...}

当我加载要恢复的工作流实例时,出现错误,因为它期望使用旧的定义。我通过在Web.config中找到旧版本1程序集来解决此问题:

<codeBase version="1.0" href="bin\v1\Entity.dll" />

现在在版本2中,当我调用WorkflowApplication.GetInstance(...)时,此帮助可成功加载旧实例。但是,当WorkflowApplication用新版本的Entity加载此实例时,则会引发以下错误(这是预期的):

  

System.Activities.InvalidWorkflowException:处理工作流树时遇到以下错误:'DynamicActivity':活动'1:DynamicActivity'的私有实现具有以下验证错误:编译器错误遇到处理表达式“ myclass” ”。   类型“ MyClass”的值不能转换为“ MyClass”。类型不匹配可能是由于在项目'vbhost'中混合了对'C:\ Users \ xxx ... aaa \ Entity.dll'的文件引用与对'C:\ Users \ xxx ... aaa \ Entity的文件引用.dll”位于项目“ vbhost”中。如果两个程序集相同,请尝试替换这些引用,以便两个引用都来自同一位置

解决此问题的根本原因的最佳方法是修改wf实例version1来声明名称空间,或者是否有一种方法可以在wf加载工作流时挂接DataContractResolver,但是我检查了MS源代码并通过了DataContractResolver = null(您可以在此处https://referencesource.microsoft.com/#System.Runtime.Serialization/System/Runtime/Serialization/XmlObjectSerializer.cs,679b47b5bfd6f11c进行检查)

我的问题是:  -有什么方法可以修改wf实例以匹配上述新更改? (版本1和版本2均已发布,并且具有大量客户数据,我们不能强迫他们在升级到新版本之前完成旧实例)  -在WF引擎加载/反序列化工作流实例时,有什么方法可以挂接以处理异常?

0 个答案:

没有答案