工作流程在手动运行时有SPContext.Current但在运行“On Change”时没有?

时间:2011-02-22 20:56:37

标签: sharepoint-2010 workflow

如果我手动运行此工作流程,它可以正常工作。当我让它自动运行“on edit”时SPContext.Current为null。如何在自动运行时访问SPContext.Current?

1 个答案:

答案 0 :(得分:4)

SharePoint会在完全不同的流程下定期运行您的工作流程。至少,您可以期望您的工作流活动显示在:

  • IIS工作进程
  • owstimer.exe进程,
  • 任何与SharePoint接口的任意可执行文件(例如控制台应用程序)。

对于触发工作流工作流场景的复杂性的事件(!!),SharePoint会选择实际执行它的进程。因此,从ASP.NET(即IIS工作进程)触发的长时间运行的工作流会自动重新安排在owstimer.exe下运行。

结果是您无法使用SPContext.Current。在工作流活动中,您必须使用提供WorkflowContext属性的Web实例。您的活动应声明类型为WorkflowContext的依赖项属性才能访问它 - 请在MSDN here中阅读更多内容。 VS项目模板将为您提供必要的代码。

示例:

public partial class LogEventActivity: Activity
{
    public static DependencyProperty __ContextProperty = DependencyProperty.Register("__Context", typeof(WorkflowContext), typeof(LogEventActivity));

    [Browsable(true)]
    [ValidationOption(ValidationOption.Required)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
    public WorkflowContext __Context
    {
        get
        {
            return (WorkflowContext)base.GetValue(__ContextProperty);
        }
        set
        {
            base.SetValue(__ContextProperty, value);
        }
    }
}