Я использую MOSS (SharePoint 2007 Enterprise), 32-разрядный, SP2.
Я заметил некоторые странные проблемы с пользовательскими операциями рабочего процесса, которые я разработал и использую в SharePoint Designer (SPD) рабочие процессы.Эти действия, кажется, работают правильно, но не «хорошо играют» с остальной частью рабочего процесса (в частности, корневая проблема была размещена по адресу: Сроки из-за изменения разрешений Custom WF Activity , так как это нея не получил никаких ответов, которые я копал глубже ...)
Чтобы помочь определить проблему, я разработал очень простой тест, который я подробно опишу ниже, и заметил еще более странныйповедение в этом тесте, о котором я расскажу вначале ...
Итак, в конце этого теста у меня есть простая SPD WF, которую я могу запустить вручную в списке, для которого я создалэтот тест, который содержит одну строку текста поля / столбца с именем «TextField».WF содержит 1 шаг, который выполняет 4 действия:
- Установить для поля значение (использует мой пользовательский WFA для присвоения "1" столбцу TextField)
- Записать "Set 1" длясписок истории рабочего процесса
- Задать поле в текущем элементе (использует действие OOTB для назначения «2» столбцу TextField)
- Записать «Set 2» в список истории рабочего процесса
Этот рабочий процесс работает отлично, успешно завершаясь с сообщениями рабочего процесса по порядку, и TextField == 2.
Однако , если я переместил последние 2 действия в началосписок действий, в результате чего один шаг WF выглядит следующим образом:
- Задать поле в текущем элементе (использует действие OOTB для назначения "2" столбцу TextField)
- Log "Установите 2 "для списка истории рабочего процесса
- Установите для поля значение (использует мой пользовательский WFA для присвоения" 1 "столбцу TextField)
- Внесите" Set 1 "в список истории рабочего процесса
В этом случае статус рабочего процесса «Произошла ошибка», и канунХотя TextField == 1 (второе назначение), единственными элементами в истории рабочего процесса являются:
- Ошибка обновления элемента списка
- Произошла ошибка в 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, делает этот взгляд правильным.Может кто-нибудь увидеть проблему в моем коде или даже попробовать это в вашей среде?