Набор средств интеграции утверждений, Azure и SharePoint (часть 5)
Набор средств интеграции утверждений, Azure и SharePoint (часть 5)
Это последняя часть серии из пяти частей, посвященной набору средств CASI (Утверждения, Azure и интеграция с SharePoint) Kit. В Часть 1 представлен вводный обзор всей платформы и решения, а также описание всех компонентов, которые будут тестироваться и рассматриваться в этой серии. В Часть 2 представлено руководство по созданию приложений WCF, настройке для них поддержки утверждений и последующему их перемещению в Windows Azure. В Часть 3 рассматривается базовый класс, который используется для заполнения сайта SharePoint данными Azure путем добавления нового пользовательского элемента управления на страницу в каталоге "_layouts". В Часть 4 рассматривается веб-часть, в которую включен набор средств CASI Kit, способы ее использования, различные ее свойства и т. д. В этой последней записи блога подробно рассматриваются два других основных сценария для этого набора средств — использование пользовательского элемента управления, построение которого рассматривалось в части 3, для извлечения данных Azure, их сохранения в кэше ASP.NET и последующего использования с другими элементами управления; а также использование пользовательского элемента управления в задаче SharePoint — в этом случае рассматривается пользовательское задание таймера SharePoint.
Использование элемента управления в других веб-частях
Один из ключевых сценариев, для которого требуется поддержка — использование платформы CASI Kit для извлечения данных с последующим их использованием в других веб-частях SharePoint. При этом остается еще одна цель разработки, которая заключается в том, чтобы НЕ выполнять обычные серверные вызовы процедуры для потенциально скрытых удаленных конечных точек WCF. В целях соответствия этими двум противоположными критериям в базовом классе реализована поддержка извлечения и сохранения данных непосредственно в кэш ASP.NET. Это позволяет разрабатывать другие пользовательские веб-части по простому образцу:
1. Проверьте, присутствуют ли ваши данные в кэше ASP.NET.
a. Если да, выполните их извлечение
b. В противном случае:
I. Создайте экземпляр пользовательского элемента управления
II. Присвойте значение OutputType параметру ServerCache и установите соответствующие значения для параметров ServerCacheName и ServerCacheTime
III. Выполните вызов метода ExecuteRequest и получите соответствующие данные
Для начала выполните запуск нового проекта Visual Studio — в этом случае речь идет о Visual Studio 2010, чтобы можно было создать новый проект SharePoint 2010. Выполните настройку проекта для создания новой веб-части, после чего необходимо добавить две ссылки — ссылку на базовый класс CASI Kit и ссылку на один из пользовательских элементов управления, создание которых рассматривалось в части 3. Обратите внимание, что при отсутствии ссылки на базовый класс CASI Kit во время тестирования и установки любых свойств элемента управления в Visual Studio эти свойства будут подчеркнуты красной волнистой линией и отобразится сообщение о том, что не удалось найти соответствующее свойство. При возникновении такой ошибки сразу будет понятно, что вы еще не добавили ссылку на базовый класс CASI Kit.
После завершения настройки ссылок можно приступать к написанию любого кода, требуемого для веб-части. На том этапе, когда требуется извлечь данные из Azure (контент или сведения о конфигурации и т. д.), ознакомьтесь с приведенным ниже описанием реализации вышеописанного способа:
string CACHE_NAME = "AzureConfigConsumerCacheSample";
int CACHE_TIME = 10;
//создаем переменную данных конфигурации того типа, который требуется загрузить
AzureWcfPage.CustomersWCF.Customer[] Customers = null;
//ищем элемент в кэше
if (HttpContext.Current.Cache[CACHE_NAME] != null)
{
//если элемент найден, приводим его к нужному типу и выполняем извлечение из кэша
Customers =
(AzureWcfPage.CustomersWCF.Customer[])
HttpContext.Current.Cache[CACHE_NAME];
}
else
{
//если элемент отсутствует в кэше, извлеките его и поместите в кэш
//создание экземпляра элемента управления
AzureWcfPage.WcfDataControl cfgCtrl = new AzureWcfPage.WcfDataControl();
//задание свойств для извлечения данных
cfgCtrl.WcfUrl = "https://azurewcf.vbtoys.com/Customers.svc";
cfgCtrl.OutputType = AzureConnect.WcfConfig.DataOutputType.ServerCache;
cfgCtrl.ServerCacheName = CACHE_NAME;
cfgCtrl.ServerCacheTime = CACHE_TIME;
cfgCtrl.MethodName = "GetAllCustomers";
//выполнение метода
bool success = cfgCtrl.ExecuteRequest();
if (success)
{
//получение строго типизированной версии данных
//тип данных должен исходить из создаваемого элемента управления
Customers =
(AzureWcfPage.CustomersWCF.Customer[])cfgCtrl.QueryResultsObject;
//если требуется XML-репрезентация объекта, можно получить
//ее из объекта QueryResultsString
string stringCustomers = cfgCtrl.QueryResultsString;
}
else
{
//возникли какая-то проблема; необходимо подключить здесь обработчик ошибок
}
}
Давайте рассмотрим код более подробно. Для начала нужно понимать, что в новой веб-части НЕ требуется добавлять в конечной точке WCF ссылку на службу. Все это уже встроено в пользовательский элемент управления, поэтому можно использовать возвращаемые типы приложения WCF, предоставляемые посредством пользовательского элемента управления. Это показано в следующей строке кода:
//создаем переменную данных конфигурации того типа, который требуется загрузить
AzureWcfPage.CustomersWCF.Customer[] Customers = null;
В этом примере в качестве моей сборки пользовательского элемента управления выступает AzureWcfPage. CustomersWCF — имя, которое я присвоил для ссылки на службу WCF. Customer является типом класса, возвращаемым методом WCF. Все это включается в новую веб-часть при добавлении ссылки на сборку пользовательского элемента управления
Первым делом я проверил наличие своих данных в кэше; если они там, то я просто помещаю их в массив экземпляров Customer, сохраненных туда ранее. В противном случае следует просто написать семь строк кода, чтобы создать экземпляр пользовательского элемента управления и извлечь данные. Сделайте следующее:
a. Создайте новый экземпляр элемента управления
b. Задайте свойства WcfUrl, MethodName, OutputType, ServerCacheName и ServerCacheTime
c. Вызовите метод ExecuteRequest
Вот и все. Если метод выполняется успешно, значение, возвращаемое из приложения WCF, сохраняется в кэш ASP.NET, так что при следующем исполнении этого кода элемент будет найден в кэше. Тем временем я могу поместить локальную переменную Customers в свойство QueryResultsObject пользовательского элемента управления, после чего можно выполнять в отношении данных любые действия, которые требуются для веб-части. В целом выполнение этой процедура должно быть относительно простым для большинства разработчиков веб-частей.
Использование элемента управления в задаче
Теперь я расскажу о способах применения пользовательского элемента управления, разработкой которого мы занимались в третьей части, для извлечения контента или данных конфигурации из Azure для последующего использования в задаче. В этом примере я написал пользовательское задание таймера SharePoint и теперь в рамках этого задания собираюсь извлечь некоторые данные из Azure. Данный пример во многом сходен с вышеописанной веб-частью, но в этом случае, как и в случае с многими другими задачами, отсутствует HttpContext, что делает невозможным использование кэша ASP.NET. В таком случае для свойства OutputType используется значение None, поскольку отображение его на странице или сохранение в кэш не требуется; вместо этого мы просто извлекаем каталог значений из QueryResultsObject или QueryResultsString. Здесь представлен пример соответствующего кода — это код из переопределения метода Execute в классе моего пользовательского задания таймера:
SPWebApplication wa = (SPWebApplication)this.Parent;
//создание экземпляра элемента управления
AzureWcfPage.WcfDataControl cfgCtrl = new AzureWcfPage.WcfDataControl();
//задание свойств для извлечения данных
cfgCtrl.WcfUrl = "https://azurewcf.vbtoys.com/Customers.svc";
cfgCtrl.OutputType = AzureConnect.WcfConfig.DataOutputType.None;
cfgCtrl.MethodName = "GetAllCustomers";
//поскольку в такой задаче, как задание таймера, отсутствует контекст http, также необходимо
//указать URL-адрес для сайта SharePoint с поддержкой утверждений. Этот адрес также будет использоваться
//для подключения к конечной точке службы маркеров безопасности в ферме SharePoint
cfgCtrl.SharePointClaimsSiteUrl = wa.Sites[0].RootWeb.Url;
//выполнение метода
bool success = cfgCtrl.ExecuteRequest();
//проверка успешности выполнения
if (success)
{
//теперь извлекайте данные и делайте с ними, что угодно
AzureWcfPage.CustomersWCF.Customer[] Customers =
(AzureWcfPage.CustomersWCF.Customer[])cfgCtrl.QueryResultsObject;
string AzureResults = cfgCtrl.QueryResultsString;
//именно здесь вы впоследствии будете выполнять задачи на основе данных, полученных из Azure
foreach(AzureWcfPage.CustomersWCF.Customer c in Customers)
{
Debug.WriteLine(c.Email);
}
Debug.WriteLine(AzureResults);
}
else
{
//примите меры для занесения в журнал того факта, что извлечение данных не было выполнено
}
Далее представлено более подробное разъяснение по этому коду. Задание таймера относится к области веб-приложения, поэтому я начну с получения ссылки на SPWebApplication, для чего запускается это задание посредством ссылки на свойство Parent. После этого я создаю пользовательский элемент управления, который разработал в третьей части, и задаю минимальный набор свойств, которые необходимы для извлечения данных из Azure. В следующей строке кода мне нужно задать свойство SharePointClaimsSiteUrl. Как я уже объяснил ранее в третьей части, когда базовый класс CASI Kit выполняется в методе ExecuteRequest, он выполняет поиск доступного контекста HttpContext. При обнаружении такого контекста он используется для определения текущего URL-адреса сайта SharePoint и выполняет подключение к службе маркеров безопасности SharePoint через этот сайт. Как уже описано выше, при выполнении этого кода в задаче, как правило, не используется контекст HttpContext. В таком случае базовому классу не удается определить, какой URL-адрес должен использоваться для подключения к службе маркеров безопасности SharePoint, поэтому в данном случае необходимо указать URL-адрес сайта в веб-приложении с поддержкой утверждений. Предполагается, что в этой реализации код задания таймера будет исполняться ТОЛЬКО в веб-приложениях с поддержкой утверждений. Поэтому я получаю ссылку на текущее веб-приложение, после чего просто указываю для нее URL-адрес первого семейства сайтов. На самом деле неважно, какое именно семейство сайтов будет использовано. Достаточно, чтобы оно просто принадлежало веб-приложению с поддержкой утверждений.
После того задания свойства SharePointClaimsSiteUrl я могу выполнить вызов метода ExecuteRequest, как было показано ранее. В случае успешного выполнения вызова я могу извлечь данные из элемента управления непосредственно с помощью свойств QueryResultsObject или QueryResultsString.
В ZIP-файл, присоединенный к этой записи блога, включены оба проекта — веб-части и задания таймера.
Готово!
Это последняя запись блога в данной серии. Надеюсь, теперь вы хорошо разбираетесь в работе с CASI Kit и понимаете, как можно использовать этот набор средств для подключения к данным, размещенным в приложении WCF на сайте или в облаке, имея при этом возможность работать с маркерами удостоверения пользователя в масштабах приложения, и даже в пределах центра обработки данных. В целом этот пример достаточно прост для реализации:
1. Создайте интерфейсное приложение WCF для своего контента или данных конфигурации. Настройте для приложения поддержку утверждений и переместите его в облако (необязательно). Также можно (необязательно) применить детально настроенные разрешения в зависимости от удостоверения и утверждений пользователя, выполняющего вызов.
2. Создайте пользовательский элемент управления, наследующий от базового класса CASI Kit. Переопределите один метод и напишите пять строк кода. Добавьте элемент управления на страницу простых макетов и выполните развертывание.
3. Добавьте веб-часть на страницу, задайте одно или несколько свойств и запустите отображение данных WCF. Элемент управления можно также использовать для извлечения контента или данных конфигурации в пользовательской веб-части или задаче (например, пользовательском задании таймера).
Вот, собственно, и все по данному вопросу. Надеюсь, с помощью CASI Kit вам удастся избежать многих сложностей и проблем, связанных с подключением фермы SharePoint к данным, хранящимся в разных уголках мира. Этот набор средств полезен для извлечения как данных конфигурации или персонализации, так и собственно контента для отображения на сайтах SharePoint. Теперь вы сможете значительно более гибко использовать систему безопасности, реализованную в приложении и в пределах центра данных в корпоративной сети. Мне было очень интересно работать над этим продуктом, и я надеюсь, что он окажется вам полезен. Как всегда, это выпуск 1 продукта, и я уверен, что в дальнейшем мы сможем многое в нем улучшить, поэтому оставляйте свои пожелания в комментариях к этой записи — я буду периодически их просматривать, и они послужат пищей для размышлений в работе над следующим выпуском.
Это локализованная запись блога. Исходная статья доступна по адресу The Claims, Azure and SharePoint Integration Toolkit Part 5
Comments
- Anonymous
January 18, 2011
Господа! Не могу найти RSS подписку на этот блог, или ее просто нет?