Поделиться через


Создание собственного поставщика внешних приложений

В этом разделе представлен обзор создания настраиваемого поставщика внешних приложений (EAP).

Дата последнего изменения: 8 апреля 2010 г.

Применимо к: SharePoint Foundation 2010

Для создания настраиваемого поставщика внешних приложений необходимо создать новые классы, производные от одного или обоих абстрактных классов:

  • SPExternalApplicationRequestResult — возможны два сценария, в которых реализуется класс, производный от SPExternalApplicationRequestResult:

    • На сайте и сервере пересылки запросов, на котором установлено внешнее приложение, все результаты, полученные от Microsoft SharePoint Foundation, должны содержать хэш клиента, который сервер пересылки запросов может проверить на неизменность результатов.

    • Требуется изменить способ отображения SilverlightWebPart или любой другой настраиваемой веб-части, в которой размещается внешнее по отношению к SharePoint приложение. Например, требуется отображать настраиваемый хром вокруг веб-части.

  • SPExternalApplicationProvider — этот класс необходимо реализовать в любом из следующих сценариев:

    • Любые ситуации, в которых реализуется класс, производный от класса SPExternalApplicationRequestResult (см. выше).

    • XML-файл внешнего приложения для веб-части содержит настраиваемую разметку, требующую чтения и обработки.

    • Требуется выполнение особой логики при создании дочернего элемента управления веб-части.

    • Требуется настроить пользовательский интерфейс SilverlightToolPart или изменить страницу регистрации приложения, которая открывается при нажатии кнопки Настройка в инструментальной панели.

Важное примечаниеВажно!

При создании настраиваемого поставщика внешних приложений следует учитывать, что можно использовать только один поставщик для всех веб-частей, в которых размещаются приложения, во всех веб-приложениях SharePoint Foundation, являющихся дочерними по отношению к заданной веб-службе.

Реализация класса результатов запроса

  1. Создайте пустой проект SharePoint в Microsoft Visual Studio 2010.

  2. Добавьте элемент класса в проект.

  3. Задайте наследование класса от SPExternalApplicationRequestResult.

  4. Если не требуется использовать хэш клиента, реализуйте свойство 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
    
  5. Если используется хэш клиента, создайте конструктор, который принимает параметр типа 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.

  6. Если не требуется настраивать отображение веб-части Silverlight или веб-части, размещающей другое приложение (не SharePoint), реализуйте метод GetContentControl(String) для возврата значения null. В противном случае реализуйте метод таким образом, чтобы он возвращал объект Control, являющийся единственным дочерним элементом управления веб-части. Обычно это объект, Literal содержащий разметку HTML.

Реализация класса поставщика внешних приложений

  1. Добавьте элемент класса в проект.

  2. Задайте наследование класса от SPExternalApplicationProvider.

  3. Если требуется настроить пользовательский интерфейс 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
    
  4. Если класс не является производным от SPExternalApplicationRequestResult, можно реализовать метод OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties) таким образом, чтобы он возвращал null. В противном случае требуется значимая реализация метода, в которой формируется и используется класс результатов запроса.

    Метод OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties) вызывается методом CreateChildControls веб-части. В частности, метод CreateChildControls реализует следующие действия:

    1. Построение объекта SPExternalApplicationRequestProperties, для чего в качестве основы применяется XML-файл внешнего приложения, используемый для регистрации веб-части, а также сведения о текущем веб-сайте.

    2. Передача объекта SPExternalApplicationRequestProperties в метод OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties).

    3. Получение объекта, производного от SPExternalApplicationRequestResult, который возвращается методом OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties).

    4. Получение единственного дочернего элемента управления веб-части с помощью метода GetContentControl(String) объекта результатов запроса.

    Рис. 1. Вызовы, осуществляемые методом CreateChildControls.

    Веб часть CreateChildControls в Silverlight

    Если по каким-либо причинам метод OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties) возвращает значение null (например, такое поведение реализовано в поставщике внешних приложений по умолчанию, входящем в состав SharePoint Foundation), метод CreateChildControls должен возвращать дочерний элемент управления по умолчанию. Это поведение метода CreateChildControls() встроенного объекта SilverlightWebPart.

    Таким образом, основная задача реализации метода OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties) состоит в вызове конструктора класса, производного от SPExternalApplicationRequestResult, и возврате сформированного объекта. Ниже приведены основные моменты, которые следует учитывать при разработке собственного переопределения метода OnApplicationWebPartCreateChildControls(SPExternalApplicationRequestProperties) method:

    В следующем примере переопределенный метод 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.

Идентификация поставщика внешних приложений в веб-службе

  1. Добавьте следующее в текстовый файл.

    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()
    
  2. Сохраните файл как EAPIdentify.ps.

  3. Выполните скрипт в окне Windows PowerShell.