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

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

В продолжении поста об использовании SPLongOperation сегодня я постараюсь описать его внутреннее устройство.

Метод Begin()

Логично будет начать исследования с вызова метода Begin(). Для чего нам понадобиться сборка Microsoft.SahrePoint.dll, обработанная деобфускатором.

Вот код этого метода:

  1. public void Begin()
  2. {
  3.   this.Begin(true);
  4. }
  5.  
  6. internal void Begin(bool closeGearPageDiv)
  7. {
  8.   if (!this.m_bLongOperationStarted)
  9.   {
  10.     string s = GearFileContent.Replace("<%=System.Threading.Thread.CurrentThread.CurrentUICulture.LCID%>", Thread.CurrentThread.CurrentUICulture.LCID.ToString(CultureInfo.InvariantCulture));
  11.     this.m_srGearAspx = new StringReader(s);
  12.     this.WriteGearToSearchString(m_strTargetDots);
  13.     if (closeGearPageDiv)
  14.     {
  15.       this.WriteGearToSearchString("SPLongOperation.EndGearPageDiv");
  16.       this.m_bGearPageDivEnded = true;
  17.     }
  18.     CurrentLongOperation = this;
  19.     this.m_bLongOperationStarted = true;
  20.   }
  21. }

GearFileContent

Это свойство возвращает содержимое файла [SharePoint Root]\TEMPLATE\LAYOUTS\gear.aspx в виде текста, предварительно заменив серверные комментарии на их HTML аналоги и "вырезав" серверные дерективы страницы. В методе Begin() происходит ещё одна манипуляция с полученным текстом - в текст подставляется идентификатор текущей локали. Таким образом сам файл gear.aspx не исполняется. Мне думается, что этот файл оставили .aspx для отладки. Можно было и просто .txt файл сделать. Файл gear.aspx

В исходном коде gear.aspx есть ещё одна очень важная особенность. Там дважды объявлены javascript-методы gotoNextPage() и setGearPageFocus(). Оба этих метода указаны в событии onload тела страницы:

  1. <body onload="setGearPageFocus();gotoNextPage();" class="s4-simple-gearpage">
Но исполняться на странице будет тот метод, который объявлен позже (если он конечно загружен).

Вывод данных пользователю

Вывод данных пользователю происходит в методе WriteGearToSearchString(), который принимает в качестве параметра текст, дойдя до которого при построчном переборе обработанного содержимого файла gear.aspx вывод прекратится. В нашем случае это "SPLongOperation.Dots":

  1. private static string m_strTargetDots = "SPLongOperation.Dots";

Клиент получит в итоге незакрытый тег body. Который браузер и будет ожидать. А наша длительная операция в это время будет исполняться на сервере. Код, выдаваемый браузеру при выполнении длительной операции

Метод End()

И вот наша операция завершена и мы смело вызываем метод End(). В теле которого формируется конечный скрипт, предназначенный для перенаправления пользователя на страницу, указанную, в моем случае в comeBackUrl.

Сформированный скрипт передается методу EndScript(), который завершает отрисовку страницы.


Поделиться

Коментарии