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

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

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

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

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

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

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

  1. var comeBackUrl = "LongTimeOperationCompleteReport.aspx";
  2. using (var operation = new SPLongOperation(Page))
  3. {
  4.   operation.LeadingHTML = "LeadingHTML";
  5.   operation.TrailingHTML = "TrailingHTML";
  6.   operation.Begin();
  7.  
  8.   Thread.Sleep(7000); // Имитация выполнения длительной операции
  9.  
  10.   operation.End(comeBackUrl, SPRedirectFlags.DoNotEncodeUrl, HttpContext.Current, null);
  11. }
comeBackUrl здесь - это URL, на который мы перенаправляем пользователя по завершению операции, LeadingHTML и TrailingHTML - лидирующий и завершающий куски HTML, выводимые пользователю. Также можно указать при вызове метода End вместо null QueryString-параметр, который будет добавлен к URL'у из comeBackUrl.

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

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

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


Поделиться

Коментарии