Створення Silverlight програм для SharePoint

Варіанти розгортання Silverlight додатків

Як завжди їх три:

  1. У sandbox вирішується віртуальна файлова система sharepoint.
  2. У повномувирішенні вирішується фізична файлова система.
  3. Додаток на зовнішньому сервері з використанням fluid application model.

Розміщення Silverlight на порталі.

Ще один варіант - створення field control на silverlight. Приклад можна переглянути у статті на msdn.

Демо-додаток

Для демонстрації всіх способів розгортання напишу простий додаток, при запуску він виводитиме Title вузла, на якому запущено програму.

Спочатку треба додати у проект SL збірки Microsoft.SharePoint.Client.Silverlight та Microsoft.SharePoint.Client.Silverlight.Runtime. Їх можна знайти в папці \TEMPLATE\LAYOUTS\ClientBin.

Тепер можна написати трохи коду:

Для тих хто не знайомий з клієнтською об'єктною моделлю SharePoint короткий лікнеп. Точка входу в клієнтську об'єктну модель – клас ClientContext, у SL додатку можна отримати “поточний контекст”, якщо програма розгорнута у SharePoint.

Всі об'єкти в клієнтській об'єктній моделі є "обіцяннями" (promise), тобто на момент отримання вони не містять значень, а лише спілкування що значення колись там будуть. Щоб завантажити властивості об'єкта з сервера, потрібно виконати метод ClientContext.Load. У методі Load можна вказати за допомогою лямбда-виразів які властивості завантажувати.

Інша особливість клієнтської об'єктної моделі полягає в тому, що команди не виконуються відразу, а складаються в чергу і відправляються на сервер при виклику ExecuteQuery\ExecuteQueryAsync. Так як у SL не можна блокувати потік UI, то скористаємосяасинхронним варіантом.

Третя особливість полягає в тому, що колббеки завершення асинхронного виклику клієнтської об'єктної моделі не маршаляться в потік UI (скільки незрозумілих слів, сам у шоці). Тому треба викликати Dispatcher.BeginInvoke щоб поміняти щось у UI або вивести Message Box.

На перший погляд код виглядає складним, але при певній вправності пишеться "на автоматі".

Розгортання на рівні ферми

Це найпростіший і пряміший варіант. Він цілком може бути виправданий якщо ви використовуєте Silverlight програму як field control для кастомного поля, в інших випадках я б не рекомендував.

Щоб розгорнути програму у фізичну файлову систему, потрібно створити один порожній елемент (SPI), навіть не потрібен маніфест (Element.xml) і фіча, їх можна просто видалити.

створення

Далі необхідно додати в елемент project output з проекту silverlight, обов'язково вказавши Deployment Type=TemplateFile

silverlight

Після цього треба додати елемент у package (не в фічу).

Останній крок перед розгортанням – увімкнути налагодження Silverlight.

можна

Після цього можна натискати F5 на проекті SharePoint, додавати на сторінку веб-частину Silverlight і ставити точки зупинки у проекті Silverlight.

створення

Розгортання у sandbox

Для розгортання рішення в sandbox треба виконати ті ж кроки, що і для fulltrust рішення, але замість порожнього елемента створити модуль, вказати Deployment Type = ElementFile в project output references і використовувати фічу для розгортання.

sharepoint

створення

І все, в маніфест модуля автоматично потрапить елемент із xap файлом.

Далі як завжди: F5, веб-частина, налагодження.

Розгортання на зовнішньому хості

Для початку треба ввімкнутипідтримку зовнішніх програм у SharePoint. Це можна зробити в PowerShell невеликим скриптом.

Я не перевіряв чи включені зовнішні програми у office 365, дуже сподіваюся що включені. Інакше я даремно це все пишу.

Щоб розмістити зовнішню програму в SharePoint, потрібно передати веб-частини Silverlight маніфест програми (applicationXml). При додаванні веб-частини з'явиться запит маніфесту (після включення зовнішніх програм).

Перш ніж створювати веб-частину, необхідно дати доступ користувачеві, який вказаний у розділі principal, за допомогою методу AddApplicationPrincipal. Найкраще це робити в коді активації фічі.

Після деплою рішення та активації фічі можна спробувати додати на сторінку веб-частину Silverlight та вказати application xml. Програма відобразиться, але відразу буде падати з помилкою.

Невеликий лікнеп про крос-доменні виклики в silverlight. За промовчанням програма SL може звертатися лише до домену, з якого він завантажений. У моделі external application в sharepoint програма silverlight знаходиться в іншому домені і йому крос-доменні виклики заборонені.

Іноді може допомогти файл clientaccesspolicy.xml, який дозволяє silvelight звертатися за межі домену, але там треба явно прописати куди можна звертатися або вказати, що звертатися можна скрізь. Але це небезпечно, так як у випадку sharepoint додаток на Silverlight передаватиме пароль по мережі для аутентифікації.

Тому зроблено таку систему. У маніфесті програми вказується куди Silverlight програма буде надсилати запити при виклику клієнтської об'єктної моделі (елемент sharepointRequestHandlerUrl). Обробник за вказаним url визначатиме який сайт sharepoint звертається та передаватиме логін та пароль саме для цього сайту.

ЩобСтворити цей обробник треба в сайті, де хоститься Silverlight створити звичайний ashx-хендлер.

Клас RequestForwarder знаходиться у “дорослій” клієнтській об'єктній моделі.

Після додавання хендлера програма перестає видавати помилку і працює нормально.

Висновок

Як бачите багато можливостей розгортання додатків Silverlight в SharePoint. При цьому сама програма не змінилася в жодному сценарії.