工作流在手动运行时有 SPContext.Current 但在“更改时”运行时没有?

发布于 2024-10-18 10:09:26 字数 94 浏览 2 评论 0原文

如果我手动运行此工作流程,它工作正常。当我让它“编辑时”自动运行时,SPContext.Current 为空。当 SPContext.Current 自动运行时,如何访问它?

If I run this workflow manually it works fine. When I let it run automatically "on edit" SPContext.Current is null. How do I get access to SPContext.Current when it is run automatically?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

爱要勇敢去追 2024-10-25 10:09:26

SharePoint 通常在完全不同的流程下运行您的工作流程。至少,您可以期望您的工作流活动出现在:

  • IIS 工作进程、
  • owstimer.exe 进程、
  • 与 SharePoint 交互的任意可执行文件(例如控制台应用程序)下。

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

结果是您无法使用SPContext.Current。在工作流活动中,您必须使用提供 Web 属性的 WorkflowContext 实例。您的活动应声明 WorkflowContext 类型的依赖属性才能访问它 - 请在 MSDN 此处。 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);
        }
    }
}

SharePoint routinely runs your workflows under completely different processes. At least, you can expect your workflow activities to appear under:

  • an IIS worker process,
  • the owstimer.exe process,
  • any arbitrary executable that interfaces with SharePoint (e.g. a console application).

In respect to the event that triggered the workflow and the complexity of the workflow scenario (!!) SharePoint selects the process that will actually execute it. Thus a long running workflow when triggered from ASP.NET (i.e. the IIS worker process) is automatically rescheduled to run under owstimer.exe.

The result is you cannot use SPContext.Current. In workflow activities you have to use a WorkflowContext instance which provides a Web property. Your activites shall declare a dependency property of type WorkflowContext to get access to it — read more in MSDN here. The VS item template will provide you with the necessary code.

Example:

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);
        }
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文