Поделиться через


Пошаговое руководство. Использование действий рабочих процессов SharePoint с полным доверием со службами Business Connectivity Services

В данном разделе руководства показано, как создать действие с полным доверием для рабочего процесса, использующего Microsoft Business Connectivity Services (BCS). Этот рабочий процесс используется в базовом сценарии утверждения расходов для получения из внешней системы сведений об утверждающем и безопасных предельных значениях с помощью Business Connectivity Services. Эти значения соответствуют конкретному сотруднику, идентифицируемому по коду сотрудника, и типу расходов.

Дата последнего изменения: 16 июля 2010 г.

Применимо к: SharePoint Server 2010

Этот раздел основан на примере действия рабочего процесса служб BCS с полным доверием, который входит в состав SDK Microsoft SharePoint 2010. Дополнительные сведения о том, как получить этот пример, см. в разделе Пример кода: BCS Full-Trust Workflow Activity Sample.

Действия с полным доверием создаются в Microsoft Visual Studio, и для их работы необходимо выполнить следующие требования:

  • Установка в глобальный кэш сборок.

  • Файл .actions помещается в папку шаблона рабочего процесса на каждом сервере в ферме.

  • В файл web.config на каждом сервере вносится запись AuthorizedTypes, разрешающая выполнение сборки. Эти сборки должны быть развернуты на каждом сервере в ферме, поэтому они требуют повышенных разрешений и пристального внимания.

Советы по использованию действий служб BCS и типичные ошибки

Действия рабочего процесса с полным доверием для Business Connectivity Services используются в следующих случаях:

  • У пользователя есть разрешение на развертывание действий с полным доверием.

  • Необходимо соблюсти одно из следующих требований:

    • Возможность чтения, создания и обновления данных во внешней системе из рабочего процесса как с подготовленным, так и с неподготовленным внешним списком.

    • Минимизация количества вызовов к внешней системе.

    • Поддержка сложной логики, требующей циклического обхода множества элементов или связей с другими внешними типами контента без использования службы изолированного кода.

При использовании действий рабочего процесса с полным доверием необходимо учитывать следующие особенности:

  • Действия с полным доверием, как следует из их названия, запускаются с полным доверием. Это означает, что перед развертыванием действия необходимо убедиться, что вы точно знаете, как оно работает, и полностью доверяете автору автору действия, как собственному администратору.

  • Если действие используется в Microsoft SharePoint Designer, необходимо возвращать фиксированное количество элементов, поскольку SharePoint Designer не поддерживает циклы.

Построение действия рабочего процесса с полным доверием

Действие, которое будет построено в этом пошаговом руководстве, возвращает утверждающего и безопасное предельное значение для указанного типа расходов и кода сотрудника. Сведения о внешнем типе контента уже встроены в действие, и оно будет работать только для этого типа.

Создание действия рабочего процесса

В этом руководстве используется тот же сценарий, что и в разделе Создание действий изолированного рабочего процесса. Однако здесь не используется внешний список; все цели сценария достигаются исключительно с помощью API-интерфейсов подключения к бизнес-данным (BDC). Это немного сложнее, чем считывание элемента из списка, поскольку API-интерфейсы BDC обеспечивают намного более гибкие возможности, чем простой список. Перед просмотром кода изучите свойства, предоставляемые этим действием. Хотя все свойства действия можно изменять в SharePoint Designer, некоторые значения по умолчанию реализованы так, что вводить данные для значений, которые должны совпадать в различных развертываниях, не требуется.

Таблица 1. Свойства действия рабочего процесса из примера

Имя

Описание

EntityName

Имя внешнего типа контента. Это значение будет жестко закодировано в примере как значение по умолчанию, однако его можно переопределить в таблице "Свойства". В производственной среде может возникнуть необходимость запретить передачу действию параметров EntityName, EntityNamespace и LobSystemIsntanceName. Причина заключается в том, что в противном случае любой пользователь SharePoint Designer сможет изменить рабочий процесс таким образом, чтобы он указывал на другой внешний тип контента, и получить доступ к информации, доступа к которой он иметь не должен. Эти свойства используются здесь в основном для изучения принципа работы кода.

EntityNamespace

Пространство имен внешнего типа контента. Это значение будет жестко закодировано в примере как значение по умолчанию, однако его можно переопределить в таблице "Свойства".

LobSystemInstanceName

Имя экземпляра внешней системы. Все имена экземпляров в SharePoint Designer представляют собой имена, введенные при обнаружении внешней системы. Однако внешние типы контента, созданные вне SharePoint Designer, могут иметь несколько имен, поэтому необходимо указать только одно. Это значение будет жестко закодировано в примере как значение по умолчанию, однако его можно переопределить в таблице "Свойства".

EmployeeID

Искомый код сотрудника.

Category

Категория расходов. В примере в качестве единственных допустимых значений этого параметра поддерживаются значения Morale (мотивация сотрудников), Equipment (оборудование) и Travel (командировки).

Approver

Это значение возвращается пользователю из внешней системы и представляет собой пользователя, утверждающего расходы.

SafeLimit

Это значение возвращается пользователю из внешней системы и представляет собой предельную сумму для конкретного пользователя и конкретного типа расходов.

Чтобы понять, что делает этот пример, просмотрите код действия в файле BDCReadActivity.cs. Обратите внимание, что весь код сосредоточен в методе Execute, который вызывается узлом рабочего процесса для выполнения действия. В этом вызове первое действие BDC получает хранилище метаданных, содержащее внешний тип контента SafeLimits, как показано в приведенном ниже коде.

private IMetadataCatalog GetMetadataCatalog(SPSite site, ISharePointService hostInterface)

Этот код может показаться простым, однако есть ряд особенностей, которые необходимо учитывать. Во-первых, каталог действует на уровне фермы, а не на уровне сайта. Это означает, что действие будет работать на любом сайте, на котором используется эта же служба BDC. Во-вторых, если элемент не найден, API-интерфейсы SharePoint, используемые для получения хранилища метаданных, возвращают значение null. Это отличается от поведения API-интерфейсов BDC, которые в подобной ситуации вызывают исключения.

Теперь, когда хранилище метаданных получено, необходимо найти внешний тип контента и вернуть правильные данные, как показано в приведенном ниже примере метода.

private void GetSafeLimits(IMetadataCatalog catalog, ISharePointService hostInterface)

Обратите внимание, что в примере кода GetEntity является блоком try/catch, поэтому в случае удаления внешнего типа контента или его отсутствия в каталоге вызывается исключение MetadataObjectNotFoundException. Для обработки этого исключения необходимо добавить запись в список журнала рабочего процесса, чтобы сообщить пользователю об исключении, после чего повторно вызвать исключение, чтобы аварийно завершить рабочий процесс.

После получения внешнего типа контента необходимо найти конкретный экземпляр этого типа. Для этого используется метод FindSpecific интерфейса IEntity. Этот метод принимает два параметра. Первый параметр Identity является идентификатором конкретного экземпляра. В данном примере в качестве идентификатора используется EmployeeID, поэтому в качестве значения Identity необходимо передать EmployeeID. На этом этапе можно увидеть, что конкретный идентификатор соответствует конкретному внешнему типу контента. Другому внешнему типу контента может соответствовать другой идентификатор с другим именем и даже с другим типом. Второй параметр представляет собой экземпляр внешней системы, используемый для поиска элемента. Как было показано выше, поскольку используется SharePoint Designer, существует только один экземпляр внешней системы, и для этого экземпляра будет использоваться имя, заданное в коде. Также обратите внимание, что если элемент не найден, метод FindSpecific вызывает другое исключение: ObjectNotFoundException. Опять-таки, перед повторным вызовом исключения для аварийного завершения рабочего процесса это исключение необходимо перехватить и вернуть пользователю понятное сообщение об ошибке. После получения экземпляра объекта все остальное выполняется просто. Для получения значений экземпляра используются имена полей в квадратных скобках.

Ниже приведены инструкции по созданию рабочего процесса на основе примера действия рабочего процесса служб BCS с полным доверием.

Настройка примера

  1. Чтобы загрузить и установить пример действия рабочего процесса служб BCS с полным доверием, следуйте инструкциям в разделе Пример кода: BCS Full-Trust Workflow Activity Sample.

  2. В SharePoint Designer создайте внешний тип контента с именем SafeLimits, пространством имен BCSBlog и экземпляром внешней системы с именем SafeLimit. Обратите внимание, что эти значения жестко заданы в коде примера действия. Кроме того, убедитесь в том, что внешний тип контента имеет следующие семь полей: EmployeeID, EquipmentLimit, EquipmentApprover, MoraleLimit, MoraleApprover, TravelLimit и TravelApprover.

    ПримечаниеПримечание

    Внешнюю систему, например базу данных, необходимо настроить с использованием структуры данных, содержащей указанные выше поля.

  3. (Необязательно) Для проверки внешнего типа контента можно создать внешний список.

  4. Откройте решение в Visual Studio 2010.

  5. Постройте решение.

    В результате будет создана библиотека BCSReadActivity.dll, которая будет развернута в глобальном кэше сборок (%windir%\assembly) на интерфейсном веб-сервере, что позволит SharePoint Server найти и загрузить действие.

    Перед построением решения убедитесь, что значения по умолчанию свойств EntityName, EntityNamespace, и LobSystemInstanceName обновлены в соответствии с настройками. Эти значения заданы в методе GetSafeLimits.

  6. Разверните решение.

    1. Добавьте сборку в файл web.config на каждом сервере фермы SharePoint.

      1. Откройте на сервере фермы файл web.config сайта SharePoint.

      2. В нижнем разделе найдите тег <System.Workflow.ComponentModel.WorkflowCompiler>. Внутри этого тега должен находиться раздел <authorizedTypes> и записи для каждого набора типов. Добавьте в файл следующую строку (убедитесь, что сведения о типе, в том числе маркер открытого ключа, указаны правильно).

        <authorizedType Assembly="BCSReadActivity, Version=1.0.0.0, Culture=neutral, PublicKeyToken=90f597110ccda6ac" Namespace="Microsoft.SharePoint.Samples" TypeName="SafeLimitActivity" Authorized="True" />
        
    2. Разверните файл BCSReadActivity.ACTIONS на каждом сервере фермы SharePoint.

      1. На каждом сервере фермы скопируйте файл BCSReadActivity.ACTIONS в следующую папку папки установки сервера SharePoint: %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\template\1033\workflow.

        ПримечаниеПримечание

        1033 — это код языка для языкового стандарта "Английский (США)". Если используется другой языковой стандарт, имя папки будет отличаться.

      2. Выполните на каждом сервере фермы команду iisreset.

Создание рабочего процесса

  1. Создайте библиотеку документов для отчетов о расходах и назовите ее ExpenseReports.

  2. Добавьте следующие столбцы:

    • EmployeeID

    • ExpenseType представляет собой поле выбора со следующими возможными значениями: Morale, Equipment, Travel

    • Approver

    • Limit

  3. В SharePoint Designer в библиотеке документов ExpenseReports нажмите кнопку Создать рабочий процесс списка.

  4. Введите имя и описание рабочего процесса и нажмите кнопку ОК.

    ПримечаниеПримечание

    На этом этапе используется конструктор рабочих процессов; уже можно приступить к добавлению действий.

  5. Вставьте действие Получение безопасных предельных значений для сотрудника.

    1. Оставьте первые два параметра без изменений. Эти параметры представляют собой выходные переменные функции Approver и SafeLimit.

    2. Для третьего параметра укажите Категорию. Это значение уже задано в списке, поэтому, как и ранее, выберите столбец ExpenseType с помощью CurrentItem, нажав функциональную кнопку (fx).

    3. Для последнего параметра выберите столбец EmployeeID с помощью CurrentItem, нажав функциональную кнопку (fx).

      Откроется новый рабочий процесс списка, как показано на рис. 1.

      Рис. 1. Новый рабочий процесс списка в Microsoft SharePoint Designer

      Рабочий процесс "Новый список" в Microsoft SharePoint Designer

  6. Добавьте другое действие для записи выходных переменных из функции для Approver и SafeLimit.

    1. Вставьте действие Обновление элемента списка.

    2. Щелкните ссылку этот список.

    3. Нажмите кнопку Добавить, а затем выберите параметр Утверждающий.

    4. В диалоговом окне Подстановка однострочного текста нажмите кнопку fx.

    5. В качестве значения параметра Источник данных выберите Рабочий процесс: переменные и параметры.

    6. В качестве значения параметра Поле из источника выберите Переменная: Утверждающий.

    7. Закройте диалоговое окно.

    8. Чтобы добавить переменную для SafeLimit, повторите действия в — ж.

  7. Сохраните рабочий процесс и опубликуйте его.

ПримечаниеПримечание

Перед запуском рабочего процесса убедитесь, что в модели BDC для внешней системы и внешнего типа контента настроены надлежащие разрешения, чтобы рабочий процесс мог получить доступ к этим ресурсам. Кроме того, для модели BDC рекомендуется использовать тип проверки подлинности Secure Store. Дополнительные сведения о рабочих процессах в Business Connectivity Services см. в разделе Использование служб Business Connectivity Services с рабочими процессами SharePoint.

Запуск рабочего процесса

  1. Заполните данными внешнюю систему.

  2. Создайте в библиотеке документов ExpenseReports один элемент. Убедитесь, что во внешней системе существуют добавленные ранее значения кода сотрудника и типа расходов.

  3. Запустите рабочий процесс.

    Рабочий процесс заполнит поля Approver и SafeLimit в записи библиотеки документов значениями из внешней системы.