我正在使用 MOSS(SharePoint 2007 Enterprise),32 位,SP2。
我注意到我在 SharePoint Designer (SPD) 工作流中开发和使用的自定义工作流活动存在一些奇怪的问题。这些操作似乎可以正常工作,但不能与工作流程的其余部分“玩得很好”(具体来说,根本问题发布在:自定义 WF 活动更改权限的时间问题,因为没有得到任何回应我'一直在深入挖掘......)
为了帮助确定问题,我开发了一个非常简单的测试,我将在下面详细概述,并且我注意到这个测试有更多奇怪的行为,这就是我将首先介绍的......
所以,在这个测试结束时,我有一个简单的 SPD WF,我可以在我为此测试创建的列表中手动启动它,其中包含一个名为“TextField”的单行文本字段/列。WF 包含执行 4 个动作的 1 个步骤:
- 将字段设置为值(使用我的自定义 WFA 将“1”分配给 TextField 列)
- 将“Set 1”记录到工作流程历史列表
- 在当前项目中设置字段(使用 OOTB 操作将“2”分配给 TextField 列)
- 将“Set 2”记录到工作流程历史列表
此工作流运行完美,按顺序成功完成工作流消息,并且 TextField==2。
但是,如果我将最后 2 个动作移动到动作列表的顶部,则使 WF 的单步看起来像:
- 在当前项目中设置字段(使用 OOTB 操作将“2”分配给 TextField 列)
- 将“Set 2”记录到工作流程历史列表
- 将字段设置为值(使用我的自定义 WFA 将“1”分配给 TextField 列)
- 将“Set 1”记录到工作流程历史列表
在这种情况下,工作流状态为“发生错误”,即使 TextField==1(第二次分配),工作流历史记录中的唯一项目是:
- 更新列表项时出错
- 设置现场测试发生错误。
(“Set Field Test”是我的 SPD WF 的名称)
所以,这就是问题的样子:如果我的自定义 WFA 首先发生,WF 工作 100%,但如果我的自定义 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\web server extensions\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 包含我的程序集的条目。
这当然是一个非常简单的动作,但即使它在我的 SPD WF 中也不能正常工作。我一定是做错了什么,但我能找到的关于创建自定义 WFA 的所有文档都让这看起来是正确的。任何人都可以在我的代码中看到问题,甚至可以在您自己的环境中尝试一下吗?