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


Создание настраиваемой службы WCF в SharePoint Foundation

Дата последнего изменения: 7 февраля 2011 г.

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

В этой части пошагового руководства показано, как создать настраиваемую службу Windows Communication Foundation (WCF), которая позволяет пользователям вернуть предыдущие версии элементов списка. История версий элементов списка недоступна с помощью других клиентских API, поэтому в этом примере создается служба, которая использует объектную модель сервера для предоставления этой функциональности клиентским приложениям.

В этом примере показано, как создать настраиваемую службу WCF в Microsoft Visual Studio 2010 как проект Microsoft SharePoint Foundation, который можно развернуть в любой ферме. Кроме того, так как тип проекта SharePoint Foundation не поддерживает библиотеки WCF по умолчанию, в этом примере библиотека службы WCF создается как внешний проект для создания CS- или VB-файлов IService1 и Service1 для проекта.

В этом примере предполагается, что предыдущие две части этого пошагового руководства выполнены (Реализация интерфейса REST SharePoint Foundation и Реализация клиентской объектной модели) и создано приложение Windows Forms, реализующее настраиваемую службу WCF.

Создание службы WCF для возвращения предыдущих версий элементов списка

  1. Чтобы создать проект SharePoint Foundation для службы WCF, откройте решение ProjectTracker в Visual Studio и затем щелкните его в окне Обозреватель решений. В меню Файл выберите команду Добавить, а затем выберите команду Создать проект. На вкладке Установленные шаблоны диалогового окна Добавить новый проект разверните узел Visual Basic или Visual C#, выберите SharePoint, а затем — Пустой проект SharePoint и введите RevertService в качестве имени проекта. Нажмите кнопку ОК.

  2. В мастере настройки SharePoint убедитесь, что для отладки указан правильный локальный сайт. Так как изолированные решения не поддерживают службы WCF, выберите параметр Развернуть как решение фермы и нажмите кнопку Готово.

  3. Чтобы создать внешний проект WCF для получения CS- или VB-файлов IService1 и Service1, щелкните решение ProjectTracker еще раз и выполните те же действия, что и на шаге 1, чтобы открыть диалоговое окно Добавить новый проект. Разверните узел Visual Basic или Visual C#, выберите WCF и Библиотека службы WCF, введите WcfService в качестве имени службы и затем нажмите кнопку ОК.

  4. Скопируйте созданные файлы IService1 и Service1 в проект RevertService. Так как проект библиотеки службы WCF больше не нужен, его можно удалить из решения, щелкнув правой кнопкой мыши элемент Библиотека службы WCF и выбрав команду Удалить.

  5. Добавьте в проект RevertService ссылки на сборки WCF System.Runtime.Serialization и System.ServiceModel, а также на главную сборку серверной объектной модели Microsoft.SharePoint. Для этого щелкните правой кнопкой мыши проект RevertService, выберите команду Добавить ссылку, а затем выберите все эти сборки на вкладке .NET.

  6. Чтобы добавить ссылку на сборку Microsoft.SharePoint.Client.ServerRuntime, которая содержит компоненты службы, предоставленные SharePoint Foundation, используйте вкладку Обзор поля Добавить ссылку для перехода к файлу Microsoft.SharePoint.Client.ServerRuntime.dll в папке %Windows%\assembly\GAC_MSIL\Microsoft.SharePoint.Client.ServerRuntime, выберите DLL-файл и нажмите кнопку ОК.

  7. Чтобы указать контракт настраиваемой службы WCF в файле IService1.cs (или IService1.vb), замените автоматически созданный контракт службы следующим определением интерфейса, где метод Revert принимает имя списка, в котором следует вернуть введенные изменения и указан идентификатор обрабатываемого элемента:

    Imports System.Runtime.Serialization
    Imports System.ServiceModel
    
    Namespace WcfService
        <ServiceContract()> _ 
        Public Interface IRevert
            <OperationContract()> _ 
            Sub Revert(ByVal listName As String, ByVal listItemId As Integer)
        End Interface
    End Namespace
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.Text;
    
    namespace WcfService
    {
        [ServiceContract]
        public interface IRevert
        {
            [OperationContract]
            void Revert(string listName, int listItemId);
        }
    }
    
  8. Укажите реализацию службы, заменив автоматически созданный код файла Service1.cs (Service1.vb) на следующий. В этом примере объектная модель SharePoint Foundation используется для получения списка по имени, получения элемента, предыдущую версию которого следует восстановить по идентификатору, и для проверки наличия версий элементов и восстановления элементов одной версии:

    Imports Microsoft.SharePoint.Client.Services
    Imports System.ServiceModel.Activation
    
    Namespace WcfService
    
        <BasicHttpBindingServiceMetadataExchangeEndpointAttribute()> _ 
        <AspNetCompatibilityRequirements(RequirementsMode := AspNetCompatibilityRequirementsMode.Required)> _ 
        Public Class RevertService
            Implements IRevert
    
            Public Sub Revert(ByVal listName As String, ByVal listItemId As Integer) Implements IRevert.Revert
                Dim oList As SPList = SPContext.Current.Web.Lists(listName)
    
                Dim oItem As SPListItem = oList.GetItemById(listItemId)
    
                If oItem.Versions.Count > 1 Then
                    oItem.Versions.Restore(1)
                End If
            End Sub
        End Class
    End Namespace
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.Text;
    
    namespace WcfService
    {
        using Microsoft.SharePoint.Client.Services;
        using System.ServiceModel.Activation;
        using Microsoft.SharePoint;
    
        [BasicHttpBindingServiceMetadataExchangeEndpointAttribute]
        [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
        public class RevertService : IRevert
        {
            public void Revert(string listName, int listItemId)
            {
                SPList oList = SPContext.Current.Web.Lists[listName];
    
                SPListItem oItem = oList.GetItemById(listItemId);
    
                if (oItem.Versions.Count > 1)
                {
                    oItem.Versions.Restore(1);
                }
            }
        }
    }
    

    В предыдущем примере в классе RevertService есть атрибут для привязки BasicHttpBindingServiceMetadataExchangeEndpointAttribute, который сообщает фабрике службы SharePoint Foundation о необходимости автоматического создания конечной точки обмена метаданными для службы.

  9. Теперь, когда реализация службы готова, можно развернуть службу в SharePoint Foundation. Щелкните правой кнопкой мыши проект RevertService, выберите команду Добавить, а затем выберите Сопоставленная папка SharePoint. В диалоговом окне Добавление сопоставленной папки SharePoint выберите параметр ISAPI и нажмите кнопку ОК для сопоставления папки ISAPI куста SharePoint Foundation с проектом RevertService. Если Visual Studio создает вложенную папку RevertService в папке ISAPI проекта RevertService, щелкните правой кнопкой мыши эту вложенную папку, а затем выберите команду Удалить, чтобы удалить ее.

  10. Чтобы создать файл регистрации для службы в папке ISAPI, щелкните папку ISAPI в проекте и затем в меню Проект выберите команду Добавить элемент. В разделе Установленные шаблоны выберите Общие. Выберите Текстовый файл, в качестве имени укажите Revert.svc и нажмите кнопку Добавить.

  11. Добавьте в файл Revert.svc следующее объявление службы, определяющее фабрики SharePoint Foundation и пространство имен, в котором они содержатся. В этом примере MultipleBaseAddressBasicHttpBindingServiceHostFactory определяет фабрику службы для типа SOAP веб-службы. В объявлении класса службы также указывается имя класса службы и используется маркер для определения строгого имени сборки.

    <%@ServiceHost Language="C#" Debug="true"
        Service="WcfService.RevertService, $SharePoint.Project.AssemblyFullName$"
        Factory="Microsoft.SharePoint.Client.Services.MultipleBaseAddressBasicHttpBindingServiceHostFactory, Microsoft.SharePoint.Client.ServerRuntime, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
    

    При создании службы в Visual Basic в качестве языка требуется указать VB вместо C# и включить имя проекта SharePoint Foundation, заданное на первом шаге, в атрибут Service следующим образом:

    <%@ServiceHost Language="VB" Debug="true"
        Service="RevertService.WcfService.RevertService, $SharePoint.Project.AssemblyFullName$"
        Factory="Microsoft.SharePoint.Client.Services.MultipleBaseAddressBasicHttpBindingServiceHostFactory, Microsoft.SharePoint.Client.ServerRuntime, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
    
  12. Так как по умолчанию Visual Studio 2010 не обрабатывает тип маркеров, используемый в предыдущем SVC-файле, необходимо добавить дополнительную инструкцию в файл проекта. Сохраните все изменения в проекте, щелкните правой кнопкой мыши проект RevertService, а затем выберите команду Выгрузить проект. Щелкните правой кнопкой мыши узел RevertService еще раз, выберите Изменить RevertService.csproj или Изменить RevertService.vbproj и добавьте тег <TokenReplacementFileExtensions> следующим образом в первую группу свойств в CSPROJ- и VBPROJ-файл, чтобы включить обработку маркеров в типы файлов с расширением SVC.

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
        <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
        <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
        <SchemaVersion>2.0</SchemaVersion>
        <ProjectGuid>{F455078E-8836-403A-9E63-5E5F21B5F694}</ProjectGuid>
        <OutputType>Library</OutputType>
        <AppDesignerFolder>Properties</AppDesignerFolder>
        <RootNamespace>RevertService</RootNamespace>
        <AssemblyName>RevertService</AssemblyName>
        <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
        <FileAlignment>512</FileAlignment>
        <ProjectTypeGuids>{BB1F664B-9266-4fd6-B973-E1E44974B511};{14822709-B5A1-4724-98CA-57A101D1B079};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
        <SandboxedSolution>False</SandboxedSolution>
        <TokenReplacementFileExtensions>svc</TokenReplacementFileExtensions>
      </PropertyGroup>
    . . . .
    
  13. После добавления предыдущего тега сохраните проект и закройте CSROJ-файл, щелкните правой кнопкой мыши проект RevertService в окне Обозреватель решений, а затем выберите команду Перезагрузить проект.

  14. Для развертывания настраиваемой веб-службы в SharePoint Foundation щелкните правой кнопкой мыши проект RevertService в окне Обозреватель решений, а затем выберите команду Развертывание. Visual Studio компилирует код проекта, выполняет построение файла WSP и развертывает его на интерфейсном веб-сервере.

  15. Для использования настраиваемой веб-службы в клиентском приложении ProjectTracker щелкните правой кнопкой мыши узел Веб-ссылки приложения в окне Обозреватель решений и выберите команду Добавить веб-ссылку. В диалоговом окне Добавление веб-ссылки введите URL-адрес настраиваемой службы WCF в поле Адрес, а затем выберите MEX в качестве стандартного имени конечной точки обмена метаданными следующим образом: https://Server/sites/SiteCollection/MyWebSite/_vti_bin/Revert.svc. Щелкните Перейти для загрузки сведений о службе и затем нажмите кнопку ОК, чтобы добавить ссылку.

  16. Чтобы добавить кнопку Вернуть в форму Form1, которая реализует настраиваемую службу, щелкните правой кнопкой мыши строку заголовка формы рядом с кнопкой Сохранить, а затем выберите Кнопка в раскрывающемся списке.

  17. В окне Свойства кнопки задайте для свойства Стиль отображения значение Текст и введите Вернуть в качестве значения параметра Текст.

  18. Дважды щелкните кнопку Вернуть и добавьте в событие Click следующий стандартный код настройки прокси-сервера WCF с вызовом настраиваемой службы WCF. Разрешите ссылки на сборки, щелкнув правой кнопкой мыши красные выделенные элементы в коде, выбрав команду Разрешить и приняв ссылки сборки для пространства имен System.ServiceModel и для пространства имен настраиваемой службы WCF (ProjectTracker.ServiceReference2).

    Private Sub toolStripButton2_Click(ByVal sender As Object, ByVal e As EventArgs)
    
        ' Set up proxy.
        Dim binding As New BasicHttpBinding()
        binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly
        binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm
        Dim endpoint As New EndpointAddress(websiteUrl + "/_vti_bin/Revert.svc")
        Dim proxy As New RevertClient(binding, endpoint)
        proxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation
    
        ' Call web service.
        proxy.Revert("Projects", DirectCast(projectsBindingSource.Current, ProjectsItem).Id)
    
        ' Refresh the UI.
        context.MergeOption = System.Data.Services.Client.MergeOption.OverwriteChanges
    
        context.Projects.ToList()
        projectsBindingSource.ResetCurrentItem()
    End Sub
    
    private void toolStripButton2_Click(object sender, EventArgs e)
    {
        // Set up proxy.
        BasicHttpBinding binding = new BasicHttpBinding();
        binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
        binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;
        EndpointAddress endpoint =
            new EndpointAddress(websiteUrl + "/_vti_bin/Revert.svc");
        RevertClient proxy = new RevertClient(binding, endpoint);
        proxy.ClientCredentials.Windows.AllowedImpersonationLevel =
            System.Security.Principal.TokenImpersonationLevel.Impersonation;
    
        // Call web service.
        proxy.Revert("Projects", ((ProjectsItem)projectsBindingSource.Current).Id);
    
        // Refresh the UI.
        context.MergeOption = System.Data.Services.Client.MergeOption.OverwriteChanges;
    
        context.Projects.ToList();
        projectsBindingSource.ResetCurrentItem();
    }
    

    Обратите внимание, что в вызове метода Revert в предыдущем примере имя списка SharePoint Foundation и свойство Current используются для возврата идентификатора текущего выбранного элемента в элементе управления DataGridView Projects. После вызова веб-службы код обновляет пользовательский интерфейс и заново получает данные из SharePoint Foundation.

  19. Нажмите клавишу F5 для запуска клиентского приложения и протестируйте веб-службу, изменив элемент в DataGridView Projects и нажав кнопку Вернуть.

Полный пример кода формы Form1 см. в разделе Полный пример формы Form1 SharePoint Foundation WCF.

См. также

Концепции

Пошаговое руководство по созданию и реализации настраиваемой службы WCF в SharePoint Foundation

Службы WCF в SharePoint Foundation 2010

Другие ресурсы

Windows Communication Foundation

Configuring Windows Communication Foundation Services