SharePoint Online, BCS и Windows Azure: реализация безопасного канала взаимодействия с внешней системой

[Скачать код]

Служба Business Connectivity Services (BCS) позволяет реализовать обмен данными и взаимодействие между порталом SharePoint Online и внешней системой (Axapta, CRM – пример для CRM Online, 1C, Siebel, Naumen и т.п.). SharePoint Online может быть полноценный участником любого бизнес-процесса организации за счет своих интеграционных возможностей: клиентской объектной модели (.Net, ECMAScript), публичных веб-сервисов, BCS и SandBox-программных модулей.

Предлагаю изучить вопрос взаимодействия SharePoint Online и внешней системы на следующем несложном примере:

  1. Работа (все CRUD операции) с контактными данными, хранящимися в SQL Azure,  через портал SharePoint Online и мобильные клиенты. 
  2. Возможность использовать эти данные в простом бизнес-процессе заведения заявки (например, help desk) через список SharePoint Online.

На рисунке ниже представлен общий сценарий взаимодействия. Для нашего случая схема является более простой: WCF сервис из Windows Azure напрямую обращается в SQL Azure и не используется Service Bus.

image

Итак, концептуально:

0. Ознакомьтесь с постами моих коллег Leveraging Windows Azure WCF Services to Connect BCS with SharePoint Online и
SharePoint Online and Windows Azure: Developing Secure BCS Connections using WCF Services, а так же подробной инструкцией (docx). Действия, описанные далее, во многом основываются на этих инструкциях.

1. Для публикации данных на портал SharePoint Online и последующей работы с ними необходимо создать WCF сервис, который послужит фактически прокси, через который идут обращения к конечной системе (SQL Azure). Напрямую обращаться к SQL Azure (или другому источнику) из BCS Online не разрешается. Локальный SharePoint Server 2010 поддерживает 3 источника данных для BCS (OLEDB базы данных, WCF сервис, .Net Assembly, которая развернута локально), для SharePoint Online поддерживается только WCF. По сути, подход на основе веб-сервиса является рекомендуемым и для локального SharePoint Server 2010, т.к. такой сценарий является наиболее правильным с точки зрения интеграции.

2. WCF сервис разместим в Windows Azure (размещение WCF сервиса именно в Windows Azure не является обязательным). В SQL Azure хранится не публичная информация, поэтому требуется ограничить доступ к сервису. Для обеспечения безопасности воспользуемся аутентификацией на основе логина и пароля и SSL каналом (замечу, что SharePoint Online не доверяет самоподписанным сертификатам (self-signed)).

3. Воспользуемся службой SharePoint Online Secure Store (SSS) для хранения учетных данных (логина и пароля) для доступа к WCF сервису. На данный момент SSS Online поддерживает только соотношение учетных данных формата 1:M, т.е. все пользователи портала сопоставляются только с одними учетными данными (пара логин\пароль) внешнего сервиса.

image

4. В SharePoint Designer создаем внешний тип (External Content Type), для которого указываем адрес WCF сервиса и созданного SSS приложения, чтобы при обращении к сервису подставлялись корректные учетные данные. На основе методов WCF сервиса создаем CRUD-операции над данными. Создаем список на основе этого типа.

image

5. Теперь необходимо модифицировать представление данных на портале и придать им более упорядоченный вид. Здесь есть два варианта: модифицировать aspx страницы (Edit in Advanced Mode) или воспользоваться InfoPath формами. Мне кажется, что InfoPath – это более простой и наглядный вариант, который так же позволяет включить дополнительную проверку и VBA код. Сразу оговорюсь, что VBA кода так же должен соответствовать правилам SandBox решений для SharePoint Online.

image

Меняем для поля URL тип на Picture.

image

Получаем новую форму в дизайнере:

image

И на портале:

image

6. Формы создания, изменения и отображения элемента получились хорошими. Теперь предлагаю модифицировать форму отображения всего списка. Здесь мы воспользуемся модификацией представления через режим Edit in Advanced Mode, а далее правкой XSLT. Наша задача отобразить не URL на фотографию, а непосредственно саму фотографию, т.е. вставить тэг img.

image

Находим шаблон XSLT, отвечающий за вывод URL фотографий, и заменяем на

<img>

<xsl:attribute name="src">

<xsl:value-of select="$thisNode/@*[name()=current()/@Name]"/>

</xsl:attribute>

<xsl:attribute name="width">

<xsl:value-of select="55"/>

</xsl:attribute>

</img>

image

И в итоге:

image

7. Создаем список и добавляем новую колонку External Data, в которой выбираем наш созданный External Content Type.

image

8. Проверяем работоспособность в браузере и так же на мобильном телефоне. Например, на Nokia Lumia 800 (Windows Phone 7) этот список отображается без проблем и поддерживает все CRUD операции.

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

[Скачать код]