1

我正在使用 MOSS(SharePoint 2007 Enterprise),32 位,SP2。

我注意到我在 SharePoint Designer (SPD) 工作流中开发和使用的自定义工作流活动存在一些奇怪的问题。这些操作似乎可以正常工作,但不能与工作流程的其余部分“玩得很好”(具体来说,根本问题发布在:自定义 WF 活动更改权限的时间问题,因为没有得到任何回应我'一直在深入挖掘......)

为了帮助确定问题,我开发了一个非常简单的测试,我将在下面详细概述,并且我注意到这个测试有更多奇怪的行为,这就是我将首先介绍的......

所以,在这个测试结束时,我有一个简单的 SPD WF,我可以在我为此测试创建的列表中手动启动它,其中包含一个名为“TextField”的单行文本字段/列。WF 包含执行 4 个动作的 1 个步骤:

  1. 将字段设置为值(使用我的自定义 WFA 将“1”分配给 TextField 列)
  2. 将“Set 1”记录到工作流程历史列表
  3. 在当前项目中设置字段(使用 OOTB 操作将“2”分配给 TextField 列)
  4. 将“Set 2”记录到工作流程历史列表

此工作流运行完美,按顺序成功完成工作流消息,并且 TextField==2。

但是,如果我将最后 2 个动作移动到动作列表的顶部,则使 WF 的单步看起来像:

  1. 在当前项目中设置字段(使用 OOTB 操作将“2”分配给 TextField 列)
  2. 将“Set 2”记录到工作流程历史列表
  3. 将字段设置为值(使用我的自定义 WFA 将“1”分配给 TextField 列)
  4. 将“Set 1”记录到工作流程历史列表

在这种情况下,工作流状态为“发生错误”,即使 TextField==1(第二次分配),工作流历史记录中的唯一项目是:

  1. 更新列表项时出错
  2. 设置现场测试发生错误。

(“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 的所有文档都让这看起来是正确的。任何人都可以在我的代码中看到问题,甚至可以在您自己的环境中尝试一下吗?

4

1 回答 1

1

我已经在我的开源项目中解决了这个问题。从http://spdactivities.codeplex.com/下载源代码并查看其中一项权限活动的源代码。您的代码不起作用的原因是 OOTB 活动参与事务,而您的自定义活动不参与。这就是您的自定义活动在所有 OOTB 活动之前运行的原因。

要参与工作流,您需要实现IPendingWork并提交到WorkflowEnvironment.WorkBatch。高温高压

于 2011-06-27T13:55:23.093 回答