.NET WF загрузить и запустить существующий старый экземпляр рабочего процесса, но с новым определением DataContract - PullRequest
0 голосов
/ 16 октября 2018

У меня есть старый рабочий процесс (с сохранением многих экземпляров), и этот старый рабочий процесс использует / ссылки на сущность (Entity.dll), определенную следующим образом: (версия 1)

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

Теперь я обновилв новую версию и MyClass превратился в (версия 2)

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

Когда я загружаю экземпляр рабочего процесса, чтобы возобновить, я получил ошибку, потому что он ожидает старого определения.Я обработал это, найдя старую сборку версии 1 в Web.config:

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

Теперь в версии 2 это помогает успешно загрузить старый экземпляр, когда я вызываю WorkflowApplication.GetInstance (...).Однако, когда WorkflowApplication загружает этот экземпляр с новой версией Entity, он вызывает следующую ошибку (что ожидается):

System.Activities.InvalidWorkflowException: При обработке дерева рабочего потока возникли следующие ошибки: 'DynamicActivity ': частная реализация действия' 1: DynamicActivity 'имеет следующую ошибку проверки: Ошибка (и) компилятора при обработке выражения «myclass».Значение типа «MyClass» не может быть преобразовано в «MyClass».Несоответствие типов может быть вызвано смешиванием ссылки на файл «C: \ Users \ xxx ... aaa \ Entity.dll» в проекте «vbhost» со ссылкой на файл «C: \ Users \ xxx ... aaa \ Entity»..dll »в проекте« vbhost ».Если обе сборки идентичны, попробуйте заменить эти ссылки, чтобы обе ссылки находились в одном и том же месте

Лучший способ устранить основную причину этой проблемы - изменить экземпляр wf version1 для объявления пространства имен ИЛИесли есть способ перехватить DataContractResolver при загрузке wf рабочего процесса, но я проверил исходный код MS и передал DataContractResolver = null (вы можете проверить его здесь https://referencesource.microsoft.com/#System.Runtime.Serialization/System/Runtime/Serialization/XmlObjectSerializer.cs,679b47b5bfd6f11c)

Мой вопрос: - Есть ли способчто мы можем изменить экземпляр wf так, чтобы он соответствовал новым изменениям, как указано выше? (версия 1 и версия 2 были выпущены и содержат много пользовательских данных, мы не можем заставить их завершить старые экземпляры перед обновлением до новой версии) - есть ли способ перехватитьдля обработки исключения, когда экземпляр рабочего процесса загрузки / десериализации WF-движка?

...