Проблема смешивания OOTB SPD WFA и пользовательских WFA - PullRequest
1 голос
/ 25 июня 2011

Я использую MOSS (SharePoint 2007 Enterprise), 32-разрядный, SP2.

Я заметил некоторые странные проблемы с пользовательскими операциями рабочего процесса, которые я разработал и использую в SharePoint Designer (SPD) рабочие процессы.Эти действия, кажется, работают правильно, но не «хорошо играют» с остальной частью рабочего процесса (в частности, корневая проблема была размещена по адресу: Сроки из-за изменения разрешений Custom WF Activity , так как это нея не получил никаких ответов, которые я копал глубже ...)

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

Итак, в конце этого теста у меня есть простая SPD WF, которую я могу запустить вручную в списке, для которого я создалэтот тест, который содержит одну строку текста поля / столбца с именем «TextField».WF содержит 1 шаг, который выполняет 4 действия:

  1. Установить для поля значение (использует мой пользовательский WFA для присвоения "1" столбцу TextField)
  2. Записать "Set 1" длясписок истории рабочего процесса
  3. Задать поле в текущем элементе (использует действие OOTB для назначения «2» столбцу TextField)
  4. Записать «Set 2» в список истории рабочего процесса

Этот рабочий процесс работает отлично, успешно завершаясь с сообщениями рабочего процесса по порядку, и TextField == 2.

Однако , если я переместил последние 2 действия в началосписок действий, в результате чего один шаг WF выглядит следующим образом:

  1. Задать поле в текущем элементе (использует действие OOTB для назначения "2" столбцу TextField)
  2. Log "Установите 2 "для списка истории рабочего процесса
  3. Установите для поля значение (использует мой пользовательский WFA для присвоения" 1 "столбцу TextField)
  4. Внесите" Set 1 "в список истории рабочего процесса

В этом случае статус рабочего процесса «Произошла ошибка», и канунХотя TextField == 1 (второе назначение), единственными элементами в истории рабочего процесса являются:

  1. Ошибка обновления элемента списка
  2. Произошла ошибка в Set Field Test.

(«Set Field Test» - это название моей SPD WF)

Итак, вот как выглядит проблема: WF работает на 100%, если мой пользовательский WFA происходит первым, нокаждый раз происходит сбой (даже если поле обновляется правильно), если мой пользовательский WFA происходит вторым.Я повторил этот тест много раз, в том числе для многократного изменения действия.

Я мог бы делать что-то глупое в моем обычном WFA, поэтому вот оно (я заменил аббревиатуру моей компании государственным агентством - получая сумму моих налоговых долларов) в целом:

using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Collections;
using System.Drawing;
using System.Reflection;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.ComponentModel.Serialization;
using System.Workflow.Runtime;
using System.Workflow.Activities;
using System.Workflow.Activities.Rules;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Workflow;

namespace NASA.workflowActivity {
public partial class TestSetFieldValueActivity : Activity {

    #region Dependency Properties

        public static DependencyProperty itemFieldProperty = DependencyProperty.Register("itemField", typeof(String), typeof(TestSetFieldValueActivity));

        public static DependencyProperty newValueProperty = DependencyProperty.Register("newValue", typeof(String), typeof(TestSetFieldValueActivity));

        public static DependencyProperty __ActivationPropertiesProperty = DependencyProperty.Register("__ActivationProperties", typeof(Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties), typeof(TestSetFieldValueActivity));

        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        [ValidationOption(ValidationOption.Required)]
        [Browsable(true)]
        public String itemField {
            get { return base.GetValue(TestSetFieldValueActivity.itemFieldProperty).ToString(); }
            set { base.SetValue(TestSetFieldValueActivity.itemFieldProperty, value); }
        }

        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        [ValidationOption(ValidationOption.Required)]
        [Browsable(true)]
        public String newValue {
            get { return base.GetValue(TestSetFieldValueActivity.newValueProperty).ToString(); }
            set { base.SetValue(TestSetFieldValueActivity.newValueProperty, value); }
        }

        [ValidationOption(ValidationOption.Required)]
        public Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties __ActivationProperties {
            get { return (Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties)base.GetValue(TestSetFieldValueActivity.__ActivationPropertiesProperty); }
            set { base.SetValue(TestSetFieldValueActivity.__ActivationPropertiesProperty, value); }
        }

    #endregion

    protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext) {
        try {
            SPListItem listItem = this.__ActivationProperties.Item;
            SPField field = listItem.Fields[this.itemField];
            listItem[field.Id] = this.newValue;
            listItem.SystemUpdate();                
        } catch {
            return ActivityExecutionStatus.Faulting;
        }
        return ActivityExecutionStatus.Closed;
    }

}
}

И мой файл .ACTIONS (сохраненный в C: \ Program Files \ Common Files \ Microsoft Shared \ расширения веб-сервера \ 12 \ TEMPLATE \ 1033 \ Workflow) содержит эту запись для этого действия:

<Action 
            Name="Set field in current item (Custom WFA)"
            ClassName="NASA.workflowActivity.TestSetFieldValueActivity"
            Assembly="NASA.workflowActivity, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f579ebeb24170bf5"
            AppliesTo="all"
            Category="NASA WFA: Test">
        <RuleDesigner Sentence="Set %1 to %2 (Custom WFA)">
            <FieldBind Id="1" Field="itemField" DesignerType="FieldNames" text="field" />
            <FieldBind Id="2" Field="newValue" DesignerType="Text" text="value" />
        </RuleDesigner>
        <Parameters>
            <Parameter Name="itemField" Type="System.String, mscorlib" Direction="In" />
            <Parameter Name="newValue" Type="System.String, mscorlib" Direction="In" />
            <Parameter Name="__ActivationProperties" Type="Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties, Microsoft.SharePoint" Direction="In" />
        </Parameters>
    </Action>

И, наконец, конечно, мой web.config содержит запись для моей сборки.

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

1 Ответ

1 голос
/ 27 июня 2011

Я на самом деле решил эту проблему в своем проекте с открытым исходным кодом. Загрузите исходный код с http://spdactivities.codeplex.com/ и посмотрите на источник для одного из разрешений. Причина, по которой ваш код не работает, заключается в том, что действия OOTB участвуют в транзакции, а ваши пользовательские действия - нет. Вот почему ваши пользовательские действия выполняются до всех действий OOTB.

Для участия в рабочем процессе необходимо реализовать IPendingWork и отправить в WorkflowEnvironment.WorkBatch . НТН

...