У меня есть рабочий процесс SharePoint, который работает каждый раз, когда объект изменяется. Рабочий процесс общается с внешним сервисом REST. Если сервис возвращает строку, я хочу обновить одно из значений полей с той строкой. К сожалению, это обновление инициирует другой экземпляр рабочего процесса для этого объекта, после того как текущий рабочий процесс завершается. Я заканчиваю с бесконечным циклом!
Как я могу предотвратить это? SPListItem имеет Обновление (), UpdateOverwriteVersion (), и SystemUpdate () методы, но ни один из них, кажется, не препятствует тому, чтобы были инициированы последующие рабочие процессы.
Я мог осмотреть последнюю измененную метку времени объекта и завершить рабочий процесс, если бы последнее обновление произошло в определенном промежутке, но я ищу больше надежного решения.
Вы можете использовать какой-то метод расширения для автоматического обновления элемента.
public static class SPListItemExtensions
{
/// <summary>
/// Provides ability to update list item without firing event receiver.
/// </summary>
/// <param name="item"></param>
/// <param name="doNotFireEvents">Disables firing event receiver while updating item.</param>
public static void Update(this SPListItem item, bool doNotFireEvents)
{
SPItemEventReceiverHandling rh = new SPItemEventReceiverHandling();
if (doNotFireEvents)
{
try
{
rh.DisableEventFiring();
item.Update();
}
finally
{
rh.EnableEventFiring();
}
}
else
{
item.Update();
}
}
/// <summary>
/// Provides ability to update list item without firing event receiver.
/// </summary>
/// <param name="item"></param>
/// <param name="incrementListItemVersion"></param>
/// <param name="doNotFireEvents">Disables firing event receiver while updating item.</param>
public static void SystemUpdate(this SPListItem item, bool incrementListItemVersion, bool doNotFireEvents)
{
SPItemEventReceiverHandling rh = new SPItemEventReceiverHandling();
if (doNotFireEvents)
{
try
{
rh.DisableEventFiring();
item.SystemUpdate(incrementListItemVersion);
}
finally
{
rh.EnableEventFiring();
}
}
else
{
item.SystemUpdate(incrementListItemVersion);
}
}
/// <summary>
/// Provides ability to update list item without firing event receiver.
/// </summary>
/// <param name="item"></param>
/// <param name="doNotFireEvents">Disables firing event receiver while updating item.</param>
public static void SystemUpdate(this SPListItem item, bool doNotFireEvents)
{
SPItemEventReceiverHandling rh = new SPItemEventReceiverHandling();
if (doNotFireEvents)
{
try
{
rh.DisableEventFiring();
item.SystemUpdate();
}
finally
{
rh.EnableEventFiring();
}
}
else
{
item.SystemUpdate();
}
}
private class SPItemEventReceiverHandling : SPItemEventReceiver
{
public SPItemEventReceiverHandling() { }
new public void DisableEventFiring()
{
base.DisableEventFiring();
}
new public void EnableEventFiring()
{
base.EnableEventFiring();
}
}
}
Не могли бы вы добавить шаг в начало рабочего процесса, который завершает рабочий процесс, если обновление было инициировано изменением этого поля? (Тот, который обновляется с помощью службы.)
У вас может быть скрытое логическое поле в элементе списка, для которого вы устанавливаете значение true при обновлении списка с помощью службы. Затем в начале рабочего процесса вы можете проверить, установлено ли в этом поле значение true.
вы можете использовать поле установки в текущем элементе в элементе списка обновлений .
Установить поле обновить элемент списка без запуска нового события