Создание Silverlight приложений для SharePoint. Часть 1.

Зачем?

Как ни странно, но этот вопрос обычно не задают. Многие хотят получить интерактивные интерфейсы SharePoint, но при этом не хотят изучать особенности объектной модели и пользоваться знакомыми инструментами.

Если все же подумать, то причины для создания Silverlight приложения могу быть следующие:

  1. Необходимость создания высокоинтерактивого интерфейса в SharePoint.
    Стандартный интерфейс sharepoint хоть построен с помощью ajax, но все же не является настолько отзывчивым, насколько этого хотят пользователи.
  2. Необходимость производить тяжелые расчеты в окружении с ограниченным доверием.
    Например при развертывании приложений в Office365 вы ограничены sandbox для серверной объектной модели. Ресурсы, потребленные серверным кодом, будут считаться и ваше решение может быть отключено. Кроме того существует тайм-аут в 30 секунда на выполнение кода в sandbox. Silverlight позволяет преодолеть эти ограничения, переложив вычисления на клиентский компьютер.
  3. Расширение возможностей пользовательского интерфейса SharePoint.
    Один из примеров таких расширений – возможность использовать drag-and-drop файлов с локального компьютера в библиотеку документов (ссылка на статью).
  4. Создание бизнес-приложения, которое в дальнейшем может быть установлено для автономной работы (out-of-browser).
  5. Hi-end media-сценарий. Без Silverlight пока что невозможен smooth streaming.

В указанных выше случаях Silverlight – практически единственная возможность решить задачу.
Кроме того Silverlight может использоваться для преодоления ограничений sandbox, связанных с вызовом внешних сервисов, для создания графических элементов управления, итд. Но все это с таким же успехом может быть реализовано с помощью HTML5\javascript.

Почему не стоит использовать Silverlight

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

  1. Мобильные устройства. На мобильных устройствах Silverlight нет, если ваше приложение не предусматривает fallback к обычному html+js, то вы потеряете функционал на мобильных устройствах.
  2. Брендинг. Чтобы приложение Silvelight выглядело как остальной портал необходимо приложить довольно много усилий.
  3. UX. Несмотря на богатую графику, простая операция вроде “выделить кусок текста и скопировать” его в Silverlight доступна только в специальных контролах.
  4. Время загрузки. Silverlight приложения загружаются после отрисовки страницы, это всегда заметно глазом человека.

Если вы все таки собираетесь использовать Silverlight в SharePoint

Посмотрите как сам SharePoint использует Silverlight. Меню создания сайта\списка сделано на Silverlight, это скорее неудачное решение. Данное меню сильно таращит на русском языке. При возникновении ошибки в процессе создания элемента появляется popup с Corellation ID, но этот Corellation ID оттуда нельзя скопировать.
Другой, гораздо более удачный, пример – множественная загрузка файлов в библиотеку. Это почти незаметный компонент, который тем не менее может сильно упростить жизнь пользователям.
Еще один хороший пример использования Silverligth в SharePoint – инструмент, называемый decomposition tree, из Performane Point Services. С его помощью можно формировать декомпозицию мер по измерениями в кубе SSAS.

Посмотрите также проект SharePoint People Search Pivot Viewer WebPart. Очень показательно какие возможности имеет Silverlight для визуализации данных SharePoint.

Чтобы научиться создавать приложения на Silverlight для SharePoint можно пройти учебный курс.



Задачи для проверки навыков разработки SharePoint

Когда я читаю курс 10175, то из положенных 5 дней лекции удается уложить в 4, а в последний день обучающиеся выполняют лабораторную работу, чтобы проверить полученные знания и навыки разработки приложений.

Ниже приведены 4 задачи, из  которых обучающиеся в парах выполняют одну. Звездочками отмечены задачи, которые не рассматриваются в курсе и требуют самостоятельного изучения.

  1. Создать систему резервирования ресурсов
    • Создать список ресурсов
    • Создать список (стандартный шаблон списка “Календарь”) со ссылкой на список ресурсов
    • Создать обработчик события добавления и изменения, который проверяет непересекаемость интервалов резервирования для ресурса и отменяет действие в случае пересечения
    • * Создать веб-часть, отображающую свободные  ресурсы в заданном интервале времени
    • Код должен работать в sandbox
  2. Создать соединенные веб-части
    • Создать веб-часть отображающую дерево организаций (подразделений)
    • Сделать её провайдером IWebPartTable
      • При выборе узла дерева веб-часть должна отправлять   профили пользователей в организации
    • Создать веб-часть потребитель IWebPartTable с помощью SPGridView
    • * Реализовать поддержку фильтрации и сортировки в SPGridView как в представлениях SharePoint
  3. Создать рабочий процесс обработки инцидентов
    • Создать список инцидентов (стандартный шаблон списка "”Списко Инцидентов”)
    • Создать State Machine Worflow с 3 состояниями: Открыт, Закрыт, Проверен
    • В каждом состоянии необходимо назначать пользователю (для простоты администратору) задачу, после выполнения задачи удалять её.
    • После после исполнения задачи процесс должен изменять состояние инцидента
    • * Сделать график времени закрытия инцидентов по типам с помощью Performace Point Services
  4. Создать задачу таймера очистки библиотек документов
    • Задача должна находить и удалять пустые папки в библиотеках документов   
    • * Доработать задачу таймера чтобы она работала только на заданных узлах (SPWeb)
    • * Создать Custom Action в Ribbon и SiteMenu для того чтобы вызвать задачу таймера.

ИМХО хороший программист SharePoint должен уметь выполнить любую задачу в течение дня.

Ваши комментарии?



SharePoint Administrator Roadmap

Снова по просьбам читателей

  1. Для изучения администрирования SharePoint понадобятся базовые знания об администрировании следующих компонент и приложений:
    1. Active Directory Domain Services
    2. SQL Server 2008
    3. IIS Weberver
  2. Для начала просмотреть видеокурс Getting Started for IT Pros.
  3. Затем курс Advanced IT Professional Training. Обязательно выполните лабораторки в этом курсе.
  4. Далее прочитайте цикл статей про развертывание SharePoint в организации.
  5. Администраторы обычно выполняют  функции Power Users, занимаются небольшими кастомизациями и обучением пользователей. Поэтому крайне необходимо изучать все материалы на сайте http://office.microsoft.com/ru-ru/training/.
  6. Если вы хотите качественно настроить поиск SharePoint, то вам может пригодиться видеокурс Enterprise Search IT professional training. Обязательно выполняйте лабораторки.
  7. Справку и различные гайды по интересующим вас аспектами SharePoint вы сможете найти в Resource Centers.
  8. Для повышения квалификации выполняйте лабораторные работы. Они отнимают немного времени и позволяют изучить различные аспекты с которыми вы (пока) не столкнулись в работе.
  9. SharePoint активно использует PowerShell для администрирования. Изучайте PowerShell, это поможет вам решать задачи, которые требуют программирования.
  10. Ответы почти на все вопросы можно найти на TechNet. Зачастую достаточно пошагово выполнить руководство чтобы все заработало как надо.


Развертывание решений SharePoint с помощью PowerShell

После прочтения кучи книг, статей и просмотра видео, обойдя все подводные камни, и сделав наконец свое решение на SharePoint у вас появляется вопрос: “а как его запустить у заказчика?” Visual Studio предательски сама активирует фичи решения по F5 и деактивирует при завершении отладки. А как тоже сделать у заказчика? А если у вас доступа на машину заказчика нет?

Для начала стоит подробнее рассмотреть что же требуется для развертывания вашего решения. Обычно развертывание состоит из нескольких шагов:

  1. Добавление WSP-решений уровня фермы
  2. Добавление sandboxed решений
  3. Активация фич
  4. Выполнение дополнительных действий

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

Вроде все просто. Вооружившись справочником по командам PowerShell  для SharePoint попробуем написать скрипт

Add-SPSolution -LiteralPath "SomePath\MySolution.wsp"
Install-SPSolution -Identity "mysolution.wsp" -GACDeployment
Enable-SPFeature MyFeature -Url http://localhost/

Сразу куча проблем:

  1. Работает только из SharePoint Management Shell
  2. Add-SPSolution  не понимает относительных путей
  3. На localhost не будет нужного сайта или надо будет разворачивать в другое место
  4. Sandboxed решения так добавить не получится

Чтобы не заставлять пользователя запускать Management Shell можно написать в начале

Add-PSSnapin Microsoft.SharePoint.Powershell

Но после этого появляется ошибка при запуске из Management shell…

Чтобы обойти проблему нужно проверять загружено ли расширение

if(!(Get-PSSnapin Microsoft.SharePoint.Powershell -ErrorAction:SilentlyContinue))
{
    Add-PSSnapin Microsoft.SharePoint.Powershell
}

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

Второй вариант скрипта:

param($siteUrl= $(Read-Host "siteUrl"))

$dir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
$name = "mysolution.wsp"
$path = "$dir\$name"

if(!(Get-PSSnapin Microsoft.SharePoint.Powershell -ErrorAction:SilentlyContinue))
{
    Add-PSSnapin Microsoft.SharePoint.Powershell
}

Add-SPSolution -LiteralPath $path
Install-SPSolution $name -GACDeployment
Enable-SPFeature MyFeature -Url $siteUrl

Так уже лучше, но тут есть подводный камень. Install-SPSolution в многосерверной конфигурации не сразу развертывает решение, фичи становится доступны когда развертывание завершится на всех серверах. Поэтому надо писать так:

$solution = Install-SPSolution $name -GACDeployment
while($solution.Deployed –eq $false)
{
    sleep -s 1
}

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

param($siteUrl= $(Read-Host "siteUrl"))

$dir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
$name = "MySolution.wsp"
$path = "$dir\$name"
$featureId = "6F9619FF-8B86-D011-B42D-00CF4FC964FF" #GUID from Wikipedia

if(!(Get-PSSnapin Microsoft.SharePoint.Powershell -ErrorAction:SilentlyContinue))
{
    Add-PSSnapin Microsoft.SharePoint.Powershell
}

$solution = Get-SPSolution $name -ErrorAction:SilentlyContinue

if(!$solution)
{    
    $solution = Add-SPSolution -LiteralPath $path
}

if($solution.Deployed –eq $false)
{
    Install-SPSolution $solution -GACDeployment
    while($solution.Deployed –eq $false)
    {
        sleep -s 1
    }
}

if(!(Get-SPFeature $featureId -Web $siteUrl -ErrorAction:SilentlyContinue)) #or -Site, -WebApplication, -Farm
{
    Enable-SPFeature $featureId -Url $siteUrl
}

И подобный код повторить для каждого решения и фичи.

Для sandboxed решений будут использоваться другие командлеты Add-SPUserSolution, Install-SPUserSolution и Get-SPUserSolution. Им необходимо дополнительным параметром передать url коллекции сайтов.

Полученный таким образом скрипт можно запускать как из SharePoint Management Shell, так и из explorer. Главное чтобы необходимые wsp файлы лежали рядом с самим скриптом.

UPD. На dev wiki появилась статья на эту тему



SharePoint 2010 и OData

Наверное все знают что SharePoint 2010 имеет OData-сервис, к которому можно обратиться по адресу http://{siteUrl}/_vti_bin/listdata.svc. Также SharePoint имеет очень мощную службу бизнес-данных (Business Connectivity Services), с помощью которой можно обращаться к различным источникам данных. К сожалению OData-сервисы не входят в число этих источников.

Чтобы исправить это досадное упущение, был создан Custom Connector для BCS, который умеет работать с OData-сервисами. А также был создан генератор модели подключения к внешним данными, чтобы упростить подключение OData источников к BCS.

Найти все это можно по адресу http://vega-soft.com/spodata/.

Фичи, реализованные на данный момент:

  1. Генератор модели
  2. CRUD-операции с данными
  3. BCS фильтры: Limit, Paging, Comparison, LastId

Фичи, планирующиеся в ближайшее время:

  1. Ассоциации (связи между сущностями)
  2. Поддержка ad-hoc запросов
  3. Аутентификация
  4. Улучшенный генератор модели

PS. Для тех кто не в курсе что такое OData – рекомендую детально изучить сайт http://www.odata.org/.