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

Данный вид расширения может быть востребован при необходимости выполнения каких-то действий в контексте основного процесса сервера (с его привилегиями), которые не могут быть выполнены с использованием стандартных методов интерфейса сервера. Механизм расширений позволяет интегрировать в контекст сервера дополнительные методы, а также обеспечивает возможность их вызова с клиента через общую объектную модель (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\\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"); (1)

method.Parameters.AddNew("FilePath", ParameterValueType.String, ".\\Test.txt"); (2)

string content = method.Execute().ToString(); (3)
1 Получаем метод расширения. Первым параметром указывается имя расширения, вторым — название метода.
2 Добавляем параметр вызываемого метода:
  • Первый аргумент — название параметра метода.

  • Второй аргумент-- тип параметра.

  • Третий аргумент — значение параметра.

3 Вызов метода