Создание собственного поставщика внешних приложений
В этом разделе представлен обзор создания настраиваемого поставщика внешних приложений (EAP).
Дата последнего изменения: 8 апреля 2010 г.
Применимо к: SharePoint Foundation 2010
Для создания настраиваемого поставщика внешних приложений необходимо создать новые классы, производные от одного или обоих абстрактных классов:
SPExternalApplicationRequestResult — возможны два сценария, в которых реализуется класс, производный от SPExternalApplicationRequestResult:
На сайте и сервере пересылки запросов, на котором установлено внешнее приложение, все результаты, полученные от Microsoft SharePoint Foundation, должны содержать хэш клиента, который сервер пересылки запросов может проверить на неизменность результатов.
Требуется изменить способ отображения SilverlightWebPart или любой другой настраиваемой веб-части, в которой размещается внешнее по отношению к SharePoint приложение. Например, требуется отображать настраиваемый хром вокруг веб-части.
SPExternalApplicationProvider — этот класс необходимо реализовать в любом из следующих сценариев:
Любые ситуации, в которых реализуется класс, производный от класса SPExternalApplicationRequestResult (см. выше).
XML-файл внешнего приложения для веб-части содержит настраиваемую разметку, требующую чтения и обработки.
Требуется выполнение особой логики при создании дочернего элемента управления веб-части.
Требуется настроить пользовательский интерфейс SilverlightToolPart или изменить страницу регистрации приложения, которая открывается при нажатии кнопки Настройка в инструментальной панели.
![]() |
---|
При создании настраиваемого поставщика внешних приложений следует учитывать, что можно использовать только один поставщик для всех веб-частей, в которых размещаются приложения, во всех веб-приложениях SharePoint Foundation, являющихся дочерними по отношению к заданной веб-службе. |
Реализация класса результатов запроса
Создайте пустой проект SharePoint в Microsoft Visual Studio 2010.
Добавьте элемент класса в проект.
Задайте наследование класса от SPExternalApplicationRequestResult.
Если не требуется использовать хэш клиента, реализуйте свойство ClientHash таким образом, чтобы оно возвращало значение null. Если необходимо включать хэш клиента в результаты, передаваемые во внешнее приложение, реализуйте свойство ClientHash в качестве оболочки частного поля для резервирования, представляющего собой массив Byte.
private Byte[] clientHash; public override Byte[] ClientHash { get { return clientHash; } }
Private clientHash_Renamed() As Byte Public Overrides ReadOnly Property ClientHash() As Byte() Get Return clientHash_Renamed End Get End Property
Если используется хэш клиента, создайте конструктор, который принимает параметр типа SPExternalApplicationRequestProperties и второй параметр типа массива байтов (представляет случайные данные клиента). Этот конструктор должен использовать свойство RequestTokenPrefix объекта SPExternalApplicationRequestProperties и массив байтов в качестве входных данных при создании значения хэша клиента. Массив данных должен иметь значение, предоставляемое сервером, на котором размещается внешнее приложение. При этом необходимо использовать тот же алгоритм, который используется во внешнем приложении для создания копии хэша клиента. Рекомендуется использовать классы пространства имен System.Security.Cryptography, например HashAlgorithm или SHA512Managed. Ниже приведен пример. Чтобы использовать класс SHA512Managed (как в этом примере), необходимо добавить в файл кода инструкцию using (Imports в Visual Basic) для пространства имен System.Security.Cryptography.
public CustomRequestResult() { } public CustomRequestResult(SPExternalApplicationRequestProperties externalAppRequest, byte[] clientSalt) { string prefix = externalAppRequest.RequestTokenPrefix; int nCount = Encoding.Unicode.GetByteCount(prefix); nCount += clientSalt.Length; byte[] bytes = new byte[nCount]; nCount = Encoding.Unicode.GetBytes(prefix, 0, prefix.Length, bytes, 0); for (int i = 0; i < clientSalt.Length; i++) { bytes[nCount + i] = clientSalt[i]; } // Compute the hash value SHA512Managed sha512 = new SHA512Managed(); clientHash = sha512.ComputeHash(bytes); }
Public Sub New() End Sub Public Sub New(ByVal externalAppRequest As SPExternalApplicationRequestProperties, ByVal clientSalt() As Byte) Dim prefix As String = externalAppRequest.RequestTokenPrefix Dim nCount As Integer = Encoding.Unicode.GetByteCount(prefix) nCount += clientSalt.Length Dim bytes(nCount - 1) As Byte nCount = Encoding.Unicode.GetBytes(prefix, 0, prefix.Length, bytes, 0) For i As Integer = 0 To clientSalt.Length - 1 bytes(nCount + i) = clientSalt(i) Next i ' Compute the hash value Dim sha512 As New SHA512Managed() clientHash = sha512.ComputeHash(bytes) End Sub
Если используется только свойство SPExternalApplicationRequestProperties, в классе, производном от RequestTokenPrefix, в конструкторе можно реализовать получение объекта String в качестве первого параметра. В этом случае вызывающий код (метод OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties), рассматриваемый далее) передает свойство RequestTokenPrefix в конструктор. Кроме того, можно реализовать создание хэша клиента до построения объекта производного типа. В этом случае создаваемый конструктор такого типа может принимать само значение хэша в качестве параметра массива байтов и немедленно записывать его в поле для резервирования clientHash.
Если не требуется настраивать отображение веб-части Silverlight или веб-части, размещающей другое приложение (не SharePoint), реализуйте метод GetContentControl(String) для возврата значения null. В противном случае реализуйте метод таким образом, чтобы он возвращал объект Control, являющийся единственным дочерним элементом управления веб-части. Обычно это объект, Literal содержащий разметку HTML.
Реализация класса поставщика внешних приложений
Добавьте элемент класса в проект.
Задайте наследование класса от SPExternalApplicationProvider.
Если требуется настроить пользовательский интерфейс SilverlightToolPart, реализуйте метод GetRegistrationInformation(SPWeb). Можно изменить любые из пяти свойств объекта SPExternalApplicationRegistrationInformation, возвращаемого этим методом. Например, если требуется использовать настраиваемую страницу регистрации, присвойте ее URL-адрес свойству HyperlinkUrl. Для предоставления других служб пользователям можно использовать встроенный код или код программной части. Например, в коде можно реализовать чтение XML-кода приложения и определение того, задается ли в нем имя участника приложения. Если это имя задается, в коде определяется, существует ли пользователь участника приложения. Если такой пользователь не существует, он создается.
В следующем примере изменяются название кнопки на странице (с "Configure" (Настройка) на "Register" (Регистрация)), текст инструкций для кнопки, а также размер диалогового окна, которое открывается при ее нажатии. Кроме того, используемая в этом примере кнопка открывает настраиваемую страницу регистрации приложения. (По умолчанию используется страница регистрации newslwp.aspx.)
public override SPExternalApplicationRegistrationInformation GetRegistrationInformation(SPWeb web) { SPExternalApplicationRegistrationInformation info = new SPExternalApplicationRegistrationInformation(); info.Description = "To register a Silverlight application (.xap), click Register"; info.DialogHeight = 600; info.DialogWidth = 500; string url = web.ServerRelativeUrl; if (!url.EndsWith("/")) { url = url + "/"; } url += "_layouts/alternateReg.aspx"; info.HyperlinkText = "Register"; info.HyperlinkUrl = url; return info; }
Public Overrides Function GetRegistrationInformation(ByVal web As SPWeb) As SPExternalApplicationRegistrationInformation Dim info As New SPExternalApplicationRegistrationInformation() info.Description = "To register a Silverlight application (.xap), click Register" info.DialogHeight = 600 info.DialogWidth = 500 Dim url As String = web.ServerRelativeUrl If Not url.EndsWith("/") Then url = url & "/" End If url &= "_layouts/alternateReg.aspx" info.HyperlinkText = "Register" info.HyperlinkUrl = url Return info End Function
Если класс не является производным от SPExternalApplicationRequestResult, можно реализовать метод OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties) таким образом, чтобы он возвращал null. В противном случае требуется значимая реализация метода, в которой формируется и используется класс результатов запроса.
Метод OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties) вызывается методом CreateChildControls веб-части. В частности, метод CreateChildControls реализует следующие действия:
Построение объекта SPExternalApplicationRequestProperties, для чего в качестве основы применяется XML-файл внешнего приложения, используемый для регистрации веб-части, а также сведения о текущем веб-сайте.
Передача объекта SPExternalApplicationRequestProperties в метод OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties).
Получение объекта, производного от SPExternalApplicationRequestResult, который возвращается методом OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties).
Получение единственного дочернего элемента управления веб-части с помощью метода GetContentControl(String) объекта результатов запроса.
Рис. 1. Вызовы, осуществляемые методом CreateChildControls.
Если по каким-либо причинам метод OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties) возвращает значение null (например, такое поведение реализовано в поставщике внешних приложений по умолчанию, входящем в состав SharePoint Foundation), метод CreateChildControls должен возвращать дочерний элемент управления по умолчанию. Это поведение метода CreateChildControls() встроенного объекта SilverlightWebPart.
Таким образом, основная задача реализации метода OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties) состоит в вызове конструктора класса, производного от SPExternalApplicationRequestResult, и возврате сформированного объекта. Ниже приведены основные моменты, которые следует учитывать при разработке собственного переопределения метода OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties) method:
Если объект, производный от SPExternalApplicationRequestResult, имеет отличное от null значение свойства ClientHash, метод OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties) должен вызывать пользовательский конструктор, созданный для класса, производного от SPExternalApplicationRequestResult. Метод OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties) должен передавать в этот конструктор тот же объект SPExternalApplicationRequestProperties, который был получен им в качестве параметра при вызове.
Даже если класс результатов запроса не имеет значимой реализации в ClientHash (и, соответственно, содержит только конструктор по умолчанию), по-прежнему необходимо передавать в метод CreateChildControls веб-части объект SPExternalApplicationRequestResult, что позволит вызывать метод GetContentControl(String). Поэтому метод OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties) необходимо реализовать в тех случаях, когда используется класс, производный от SPExternalApplicationRequestResult.
Реализация метода OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties) поддерживает выполнение других действий, например чтение настраиваемых свойств, которые содержит XML-файл внешнего приложения.
В следующем примере переопределенный метод OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties) вызывает пользовательский конструктор класса CustomRequestResult, который является производным от SPExternalApplicationRequestResult. Дополнительные сведения о таком пользовательском конструкторе см. в описании процедуры Реализация класса результатов запроса этой статьи.
public override SPExternalApplicationRequestResult OnApplicationWebPartCreateChildControls( SPExternalApplicationRequestProperties args) { SPExternalApplicationRequestResult reqRes = CustomRequestResult(args, saltFromApplication); return reqRes; }
Public Overrides Function OnApplicationWebPartCreateChildControls(ByVal args As SPExternalApplicationRequestProperties) As SPExternalApplicationRequestResult Dim reqRes As SPExternalApplicationRequestResult = CustomRequestResult(args, saltFromApplication) Return reqRes End Function
Идентификация поставщика внешних приложений в веб-службе
Процесс идентификации настраиваемого поставщика внешних приложений в SharePoint Foundation практически идентичен процессу включения поставщика, описанному в разделе Включение поставщика внешних приложений. Единственное различие заключается в том, что вместо включения поставщика необходимо сформировать объект типа поставщика внешних приложений и присвоить его свойству ExternalApplicationSettings.Provider. Ниже приведен пример, в котором класс ContosoEAP является производным от SPExternalApplicationProvider.
ContosoEAP exAppProvider = new ContosoEAP();
SPWebService.ContentService.ExternalApplicationSettings.Provider = exAppProvider;
SPWebService.ContentService.ExternalApplicationSettings.Enabled = true;
SPWebService.ContentService.Update();
Dim exAppProvider As New ContosoEAP()
SPWebService.ContentService.ExternalApplicationSettings.Provider = exAppProvider
SPWebService.ContentService.ExternalApplicationSettings.Enabled = True
SPWebService.ContentService.Update()
![]() |
---|
Строка, в которой задается свойство Enabled, может не использоваться в том случае, когда управление внешними приложениями для веб-службы уже включено. Если ранее такое управление не было включено, ввод этой строки избавляет от необходимости выполнять процедуру, описанную в разделе Включение поставщика внешних приложений. Однако если используется поставщик внешних приложений по умолчанию, по-прежнему необходимо выполнять код включения управления. |
Можно использовать любые методы для выполнения предыдущих строк кода, описанные в разделе Включение поставщика внешних приложений. В следующем примере показано выполнение кода с использованием командлета Windows PowerShell Add-Type в скрипте PowerShell.
Идентификация поставщика внешних приложений в веб-службе
Добавьте следующее в текстовый файл.
Add-type @" using System; using Microsoft.SharePoint.Administration; namespace ContosoCmdlets public class EAPIdentifier { public static void IdentifyEAP() { ContosoEAP exAppProvider = new ContosoEAP(); SPWebService.ContentService.ExternalApplicationSettings.Provider = exAppProvider; SPWebService.ContentService.ExternalApplicationSettings.Enabled = true; SPWebService.ContentService.Update(); } } "@ -Language CsharpVersion3 [ContosoCmdlets.EAPIdentifier]::IdentifyEAP()
Сохраните файл как EAPIdentify.ps.
Выполните скрипт в окне Windows PowerShell.