Длительные операции в SharePoint. Снаружи

Часть 1. SPLongOperation снаружи
Часть 2. SPLongOperation изнутри
Часть 3. SPLongOperation. Request timed out
Часть 4. Длительные операции с обновляемым статусом

В этом посте я расскажу о выполнении длительных операций на стороне сервера, используя предназначенный для этого механизм самого SharePoint'а - SPLongOperation в кастомнои коде.

Что это такое?

Те, кто работал с SharePoint'ом хоть сколько-нибудь времени, узнают его издалека:

Индикатор выполнения длительной операции в SharePoint 2010

Индикатор выполнения длительной операции в SharePoint 2010

В SharePoint 2007 он выглядел вот так:

Индикатор выполнения длительной операции в SharePoint 2007

Индикатор выполнения длительной операции в SharePoint 2007

Суть от этого не меняется. Этот пост относится к SharePoint 2007 и SharePoint 2010 в равной степени. Только скриншоты я буду делать с SharePoint 2010, за неимением рабочей версии 2007-го.

Как использовать

Использовать очень просто: создаем экземпляр класса SPLongOperation, реализующий интерфейс IDisposable, "заворачиваем" его в конструкцию using, в которой у нас и будет происходить выполнение длительной операции:

var comeBackUrl = "LongTimeOperationCompleteReport.aspx";
using (var operation = new SPLongOperation(Page))
{
  operation.LeadingHTML = "LeadingHTML";
  operation.TrailingHTML = "TrailingHTML";
  operation.Begin();
 
  Thread.Sleep(7000); // Имитация выполнения длительной операции
 
  operation.End(comeBackUrl, SPRedirectFlags.DoNotEncodeUrl, HttpContext.Current, null);
}

comeBackUrl здесь - это URL, на который мы перенаправляем пользователя по завершению операции, LeadingHTML и TrailingHTML - лидирующий и завершающий куски HTML, выводимые пользователю. Также можно указать при вызове метода End вместо null QueryString-параметр, который будет добавлен к URL'у из comeBackUrl.

Вот и весь механизм применения.

Очень важная особенность

Длительная операция на сервере исполняется синхроно. Асинхронности по умолчанию не предусмотренно, её придется реализовывать самим. Поэтому надо быть готовым к получению исключения по тайм-ауту (System.Web.HttpException: Request timed out).

Теги

Поделиться

Виталий Жуков

Виталий Жуков

Техлид, Архитектор, Разработчик, Microsoft MVP. Более 20 лет опыта в области системной интеграции и разработки программного обеспечения. Специализируюсь на проектировании и внедрении масштабируемых высокопроизводительных программных решений в различных отраслях.