Подтвердить что ты не робот

SharePoint Workflow: как обновить элемент без повторного запуска рабочего процесса

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

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

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

4b9b3361

Ответ 1

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

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


   }
}

Ответ 3

Кажется, Microsoft переработала это в SharePoint 2010, события EventFiringEnabled и EventFiringDisabled устарели.

Вместо этого используйте логическое свойство с именем EventFiringEnabled.

Ответ 4

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

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

Ответ 5

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

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