Длительные операции в SharePoint. Снаружи
Часть 1. SPLongOperation снаружи
Часть 2. SPLongOperation изнутри
Часть 3. SPLongOperation. Request timed out
Часть 4. Длительные операции с обновляемым статусом
В этом посте я расскажу о выполнении длительных операций на стороне сервера, используя предназначенный для этого механизм самого SharePoint'а - SPLongOperation в кастомнои коде.
Что это такое?
Те, кто работал с SharePoint'ом хоть сколько-нибудь времени, узнают его издалека:
В 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).