Серверные расширения

Данный вид расширения может быть востребован при необходимости выполнения каких-то действий в контексте основного процесса сервера (с его привилегиями), которые не могут быть выполнены с использованием стандартных методов интерфейса сервера. Механизм расширений позволяет интегрировать в контекст сервера дополнительные методы, а также обеспечивает возможность их вызова с клиента через общую объектную модель (ObjectManager).

Серверное расширение представляет собой .NET сборку (Class Library), в которой должен быть реализован как минимум один класс, унаследованный от DocsVision.Platform.StorageServer.Extensibility.StorageServerExtension.

Этот базовый класс уже содержит в себе всю необходимую инфраструктуру для реализации модуля расширения. Разработчику остается только определить сигнатуру методов, реализуемых данным модулем расширения. Такие методы необходимо пометить специальным атрибутом: ExtensionMethod.

Атрибут ExtensionMethod имеет дополнительное свойство AllowedUserRoles, которое можно использовать для ограничения возможности вызова данного метода расширения в зависимости от роли пользователя (членства в соответствующей группе безопасности). Пример использования свойства (метод будет доступен только для членов группы DocsVision Administrators): ExtensionMethod(UserRoles.Administrator).

Пример кода реализации серверного расширения, где метод GetBaseName возвращает имя рабочей базы данных:

using System;
using System.IO;
using DocsVision.Platform.StorageServer.Methods;
using DocsVision.Platform.StorageServer.Extensibility;

namespace DocsVision.Samples
{
 public sealed class SampleExtension : StorageServerExtension
 {
  public SampleExtension(){ }

  [ExtensionMethod]
  public string GetBaseName()
  {
   return this.Request.Base.Name;
  }
 }
}

В качестве возвращаемого значения метод может вернуть либо скаляр, либо набор данных (коллекцию). Во втором случае лучше воспользоваться специальным типом возвращаемого значения — DocsVision.Platform.StorageServer.CursorInfo. Этот объект позволяет создать серверный курсор, из которого потом можно читать данные на клиенте.

Объект CursorInfo можно создать двумя способами:

  • с помощью метода GetCursorBuilder, который возвращает объект CursorBuilder и позволяет программно заполнять серверный курсор.

  • с помощью метода ExecuteCursorCommand, который выполняет SQL-команду, сохраняет её результаты в курсоре, и возвращает готовый CursorInfo.

Пример реализации серверного метода, возвращающего набор значений:

[ExtensionMethod]
public CursorInfo GetSectionsSize()
{
 using (DatabaseCommand Command = base.DbRequest.DataLayer.Connection.CreateCommand("dvsys_help_show_section_size", CommandType.StoredProcedure))
 {
  return base.ExecuteCursorCommand(Command);
 }
}

Готовый модуль расширения необходимо зарегистрировать на сервере. Для этого нужно в ветке реестра [HKEY_LOCAL_MACHINE\SOFTWARE\DocsVision\Platform\5.5\Server\Extensions] создать строковое значение с названием расширения (любое уникальное, на латинице, без пробелов и спец. знаков) и значением, представляющим полное имя класса, реализующего интерфейс расширения, к примеру:

"BackOfficeExtension"="DocsVision.BackOffice.ServerExtension.Extension, DocsVision.BackOffice.ServerExtension, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7148afe997f90519"

Для вызова методов модуля расширения на клиенте необходимо воспользоваться специальным объектом — менеджером расширений (ExtensionManager). Менеджер расширений содержит метод для вызова у указанного расширения определённого метода: GetExtensionMethod.

Если такого расширения или метода на сервере не зарегистрировано, функция вернет ошибку. В противном случае будет возвращен специальный объект — ExtensionMethod, с помощью которого уже можно выполнять непосредственные вызовы метода серверного расширения.

Параметры вызова серверного метода задаются через коллекцию Parameters, в которую их необходимо явно добавить в виде объектов ExtensionMethodParameter. Этот объект очень прост — он описывает название, тип и значение параметра через одноименные свойства.

Пример кода вызова метода серверного расширения:

//Получаем метод расширения
// Первым параметром указывается имя расширения, вторым -- название метода
ExtensionMethod method = session.ExtensionManager.GetExtensionMethod("BackOfficeExtension", "GetFileContent");

// Добавляем параметр вызываемого метода
// первый аргумент -- название параметра метода
// второй -- тип параметра
// третий -- значение параметра
method.Parameters.AddNew("FilePath", ParameterValueType.String, "C:\\Test.txt");

//Вызов метода
string content = method.Execute().ToString();