Рабочий процесс SharePoint: как обновить объект, не инициировав рабочий процесс снова

У меня есть рабочий процесс SharePoint, который работает каждый раз, когда объект изменяется. Рабочий процесс общается с внешним сервисом REST. Если сервис возвращает строку, я хочу обновить одно из значений полей с той строкой. К сожалению, это обновление инициирует другой экземпляр рабочего процесса для этого объекта, после того как текущий рабочий процесс завершается. Я заканчиваю с бесконечным циклом!

Как я могу предотвратить это? SPListItem имеет Обновление (), UpdateOverwriteVersion (), и SystemUpdate () методы, но ни один из них, кажется, не препятствует тому, чтобы были инициированы последующие рабочие процессы.

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

11
задан Philipp Schmid 17 March 2010 в 23:04
поделиться

3 ответа

Вы можете использовать какой-то метод расширения для автоматического обновления элемента.

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();
    }


   }
}
18
ответ дан 3 December 2019 в 04:13
поделиться

Не могли бы вы добавить шаг в начало рабочего процесса, который завершает рабочий процесс, если обновление было инициировано изменением этого поля? (Тот, который обновляется с помощью службы.)

У вас может быть скрытое логическое поле в элементе списка, для которого вы устанавливаете значение true при обновлении списка с помощью службы. Затем в начале рабочего процесса вы можете проверить, установлено ли в этом поле значение true.

0
ответ дан 3 December 2019 в 04:13
поделиться

вы можете использовать поле установки в текущем элементе в элементе списка обновлений .

Установить поле обновить элемент списка без запуска нового события

-3
ответ дан 3 December 2019 в 04:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: