Рабочий процесс имеет SPContext.Current при запуске вручную, но не при запуске «При изменении»? - PullRequest
2 голосов
/ 22 февраля 2011

Если я запускаю этот рабочий процесс вручную, он работает нормально. Когда я позволяю ему запускаться автоматически "при редактировании", SPContext.Current имеет значение null. Как получить доступ к SPContext.Current, когда он запускается автоматически?

1 Ответ

4 голосов
/ 23 февраля 2011

SharePoint регулярно запускает ваши рабочие процессы в совершенно разных процессах. По крайней мере, вы можете ожидать, что ваши рабочие процессы появятся в:

  • рабочий процесс IIS,
  • процесс owstimer.exe,
  • любой произвольный исполняемый файл, который взаимодействует с SharePoint (например, консольное приложение).

В отношении события, которое запустило рабочий процесс и сложность сценария рабочего процесса (!!) SharePoint выбирает процесс, который будет фактически его выполнять. Таким образом, длительный рабочий процесс при запуске из ASP.NET (т.е. рабочий процесс IIS) автоматически перепланируется для запуска в owstimer.exe.

В результате вы не можете использовать SPContext.Current. В операциях рабочего процесса вы должны использовать экземпляр WorkflowContext, который предоставляет свойство Web. Ваши действия должны объявить свойство зависимости типа 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);
        }
    }
}
...