Выноски CRM 3.0, запущенные в CRM 4.0, вызывают бесконечный цикл

Я перекомпилировал библиотеку выносок CRM 3.0 и развернул их в своем экземпляре CRM 4.0. Один из моих вызовов PostUpdate вызывает service.Update(). Это заставляет метод обновления срабатывать много раз. Это в конечном итоге останавливается из-за ошибок тайм-аута. Этого не происходит, когда эти выноски используются с CRM 3.0.

Подпись метода следующая для точки входа в этот пользовательский код.

public override void PostUpdate(CalloutUserContext userContext, CalloutEntityContext entityContext, string preImageEntityXml, string postImageEntityXml)

1 ответ

Решение

Одним из атрибутов в IPluginExecutionContext является глубина. Это указывает на то, насколько "глубоко" в плагине "стек вызовов" выполняется ваш плагин. Когда вы нажимаете "Сохранить" в форме CRM, вы начинаете с глубины 1. Каждый раз, когда вы обновляете вызовы после обновления, глубина увеличивается.

Вы обнаружите, что некоторые люди просто проверят, что глубина равна 1, прежде чем выполнять свою логику плагина. Это не подходит для всех, однако. Если рабочий процесс должен был обновить эту сущность, то глубина была бы 2 (рабочий процесс был 1, теперь ваше обновление - 2).

Когда глубина достигает 8, CRM останавливает выполнение, называя его рекурсивным. Я не уверен, что вы на самом деле сбиваете тайм-аут или эту ошибку. Прошло много времени с тех пор, как я видел, какую ошибку они выдают.

Мы разработали пользовательский код во всем нашем решении, где мы должны проверять рекурсию. Я не в состоянии поделиться всем этим, но у вас может быть идея, если вам это нравится.

Еще одна пара идей - добавить собственный атрибут к вашей сущности. Не помещайте это в форму. Обычно этот атрибут не существует в вашей сумке свойств обновления. Когда вы вызываете обновление из кода, который должен закорачивать ваш плагин обновления в следующий раз, установите атрибут. Если атрибут установлен, вы бы замкнули накоротко, а не обработали плагин.

Надеюсь это поможет.

Другие вопросы по тегам