Создание настраиваемой службы 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 для возвращения предыдущих версий элементов списка
Чтобы создать проект SharePoint Foundation для службы WCF, откройте решение ProjectTracker в Visual Studio и затем щелкните его в окне Обозреватель решений. В меню Файл выберите команду Добавить, а затем выберите команду Создать проект. На вкладке Установленные шаблоны диалогового окна Добавить новый проект разверните узел Visual Basic или Visual C#, выберите SharePoint, а затем — Пустой проект SharePoint и введите RevertService в качестве имени проекта. Нажмите кнопку ОК.
В мастере настройки SharePoint убедитесь, что для отладки указан правильный локальный сайт. Так как изолированные решения не поддерживают службы WCF, выберите параметр Развернуть как решение фермы и нажмите кнопку Готово.
Чтобы создать внешний проект WCF для получения CS- или VB-файлов IService1 и Service1, щелкните решение ProjectTracker еще раз и выполните те же действия, что и на шаге 1, чтобы открыть диалоговое окно Добавить новый проект. Разверните узел Visual Basic или Visual C#, выберите WCF и Библиотека службы WCF, введите WcfService в качестве имени службы и затем нажмите кнопку ОК.
Скопируйте созданные файлы IService1 и Service1 в проект RevertService. Так как проект библиотеки службы WCF больше не нужен, его можно удалить из решения, щелкнув правой кнопкой мыши элемент Библиотека службы WCF и выбрав команду Удалить.
Добавьте в проект RevertService ссылки на сборки WCF System.Runtime.Serialization и System.ServiceModel, а также на главную сборку серверной объектной модели Microsoft.SharePoint. Для этого щелкните правой кнопкой мыши проект RevertService, выберите команду Добавить ссылку, а затем выберите все эти сборки на вкладке .NET.
Чтобы добавить ссылку на сборку Microsoft.SharePoint.Client.ServerRuntime, которая содержит компоненты службы, предоставленные SharePoint Foundation, используйте вкладку Обзор поля Добавить ссылку для перехода к файлу Microsoft.SharePoint.Client.ServerRuntime.dll в папке %Windows%\assembly\GAC_MSIL\Microsoft.SharePoint.Client.ServerRuntime, выберите DLL-файл и нажмите кнопку ОК.
Чтобы указать контракт настраиваемой службы 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); } }
Укажите реализацию службы, заменив автоматически созданный код файла 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 о необходимости автоматического создания конечной точки обмена метаданными для службы.
Теперь, когда реализация службы готова, можно развернуть службу в SharePoint Foundation. Щелкните правой кнопкой мыши проект RevertService, выберите команду Добавить, а затем выберите Сопоставленная папка SharePoint. В диалоговом окне Добавление сопоставленной папки SharePoint выберите параметр ISAPI и нажмите кнопку ОК для сопоставления папки ISAPI куста SharePoint Foundation с проектом RevertService. Если Visual Studio создает вложенную папку RevertService в папке ISAPI проекта RevertService, щелкните правой кнопкой мыши эту вложенную папку, а затем выберите команду Удалить, чтобы удалить ее.
Чтобы создать файл регистрации для службы в папке ISAPI, щелкните папку ISAPI в проекте и затем в меню Проект выберите команду Добавить элемент. В разделе Установленные шаблоны выберите Общие. Выберите Текстовый файл, в качестве имени укажите Revert.svc и нажмите кнопку Добавить.
Добавьте в файл 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" %>
Так как по умолчанию 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> . . . .
После добавления предыдущего тега сохраните проект и закройте CSROJ-файл, щелкните правой кнопкой мыши проект RevertService в окне Обозреватель решений, а затем выберите команду Перезагрузить проект.
Для развертывания настраиваемой веб-службы в SharePoint Foundation щелкните правой кнопкой мыши проект RevertService в окне Обозреватель решений, а затем выберите команду Развертывание. Visual Studio компилирует код проекта, выполняет построение файла WSP и развертывает его на интерфейсном веб-сервере.
Для использования настраиваемой веб-службы в клиентском приложении ProjectTracker щелкните правой кнопкой мыши узел Веб-ссылки приложения в окне Обозреватель решений и выберите команду Добавить веб-ссылку. В диалоговом окне Добавление веб-ссылки введите URL-адрес настраиваемой службы WCF в поле Адрес, а затем выберите MEX в качестве стандартного имени конечной точки обмена метаданными следующим образом: https://Server/sites/SiteCollection/MyWebSite/_vti_bin/Revert.svc. Щелкните Перейти для загрузки сведений о службе и затем нажмите кнопку ОК, чтобы добавить ссылку.
Чтобы добавить кнопку Вернуть в форму Form1, которая реализует настраиваемую службу, щелкните правой кнопкой мыши строку заголовка формы рядом с кнопкой Сохранить, а затем выберите Кнопка в раскрывающемся списке.
В окне Свойства кнопки задайте для свойства Стиль отображения значение Текст и введите Вернуть в качестве значения параметра Текст.
Дважды щелкните кнопку Вернуть и добавьте в событие 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.
Нажмите клавишу F5 для запуска клиентского приложения и протестируйте веб-службу, изменив элемент в DataGridView Projects и нажав кнопку Вернуть.
Полный пример кода формы Form1 см. в разделе Полный пример формы Form1 SharePoint Foundation WCF.
См. также
Концепции
Пошаговое руководство по созданию и реализации настраиваемой службы WCF в SharePoint Foundation
Службы WCF в SharePoint Foundation 2010