Рабочий процесс SharePoint: как обновить элемент без повторного запуска рабочего процесса - PullRequest
11 голосов
/ 18 марта 2010

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

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

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

Ответы [ 5 ]

18 голосов
/ 18 марта 2010

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

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


   }
}
8 голосов
/ 28 июня 2011
2 голосов
/ 28 января 2011

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

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

0 голосов
/ 18 марта 2010

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

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

0 голосов
/ 18 марта 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...