Creación de un servicio de WCF personalizado en SharePoint Foundation

Última modificación: lunes, 07 de febrero de 2011

Hace referencia a: SharePoint Foundation 2010

En esta parte del tutorial se muestra cómo crear un servicio personalizado de Windows Communication Foundation (WCF) que permite a los usuarios revertir elementos de lista a las versiones anteriores. El historial de versiones de los elementos de lista no se expone a través de las otras API de cliente y, por lo tanto, este ejemplo crea un servicio que usa el modelo de objetos del lado servidor para proporcionar esta funcionalidad a las aplicaciones cliente.

En el ejemplo se muestra cómo crear un servicio WCF personalizado en Microsoft Visual Studio 2010 como un proyecto de Microsoft SharePoint Foundation que se puede implementar en cualquier conjunto o granja de servidores. Además, debido a que el tipo de proyecto de SharePoint Foundation no es compatible con las bibliotecas WCF de manera predeterminada, este ejemplo implica la creación de una biblioteca de servicios WCF como un proyecto externo para generar los archivos IService1 y Service1 con extensión .cs o .vb para el proyecto.

En este ejemplo se presupone que finalizó las dos partes anteriores de este tutorial (Implementación de la interfaz REST de SharePoint Foundation y Implementación del modelo de objetos del cliente) y que creó una aplicación de Windows Forms que se usa para implementar el servicio WCF personalizado.

Creación de un servicio WCF para revertir elementos de lista a las versiones anteriores

  1. Para crear un proyecto de SharePoint Foundation para el servicio WCF, abra la solución ProjectTracker en Visual Studio. En el Explorador de soluciones, haga clic en la solución. En el menú Archivo, elija Agregar y, a continuación, haga clic en Nuevo proyecto. En la ficha Plantillas instaladas del cuadro de diálogo Agregar nuevo proyecto, expanda el nodo Visual Basic o Visual C#, seleccione SharePoint, seleccione Proyecto de SharePoint vacío y, a continuación, escriba RevertService como nombre del proyecto. Haga clic en Aceptar.

  2. En el Asistente para la personalización de SharePoint, compruebe que se ha especificado el sitio local correcto para la depuración. Debido a que las soluciones de espacio aislado no son compatibles con los servicios de WCF, seleccione Implementar como solución de granja de servidores y, a continuación, haga clic en Finalizar.

  3. Para crear el proyecto externo de WCF a fin de obtener los archivos IService1 y Service1 con extensión .cs o .vb, vuelva a hacer clic en la solución ProjectTracker y siga el mismo procedimiento que en el paso 1 para abrir el cuadro de diálogo Agregar nuevo proyecto. Expanda el nodo Visual Basic o Visual C#, seleccione WCF, seleccione Biblioteca de servicios de WCF, escriba WcfService como nombre y, a continuación, haga clic en Aceptar.

  4. Copie los archivos IService1 y Service1 generados en el proyecto RevertService. Debido a que ya no necesita el proyecto de biblioteca de servicios de WCF, puede quitarlo de la solución haciendo clic con el botón secundario en la biblioteca de servicios de WCF y haciendo clic en Quitar.

  5. Agregue referencias del proyecto RevertService a los ensamblados WCF System.Runtime.Serialization y System.ServiceModel y a Microsoft.SharePoint, el ensamblado principal del modelo de objetos de servidor. Haga clic con el botón secundario en el proyecto RevertService, haga clic en Agregar referencia y seleccione cada uno de estos ensamblados en la ficha .NET.

  6. Para agregar una referencia a Microsoft.SharePoint.Client.ServerRuntime, que contiene las fábricas de servicios proporcionadas por SharePoint Foundation, use la ficha Examinar del cuadro Agregar referencia, para navegar al archivo Microsoft.SharePoint.Client.ServerRuntime.dll en %Windows%\assembly\GAC_MSIL\Microsoft.SharePoint.Client.ServerRuntime, seleccione el archivo DLL y, a continuación, haga clic en Aceptar.

  7. Para especificar el contrato del servicio de WCF personalizado en IService1.cs (o IService1.vb), sustituya el contrato de servicio generado automáticamente con la siguiente definición de interfaz, donde el método Revert acepta el nombre de la lista en la que se van a revertir los cambios y el identificador del elemento que se va a revertir:

    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. Especifique la implementación del servicio reemplazando el código generado automáticamente de Service1.cs (Service1.vb) con el código siguiente. El ejemplo usa el modelo de objetos de SharePoint Foundation para recuperar la lista por su nombre, para recuperar el elemento para revertir por identificador y para buscar si existen versiones del elemento y revertirlas a la versión inmediatamente anterior:

    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);
                }
            }
        }
    }
    

    En el ejemplo anterior, la clase RevertService tiene un atributo de enlace, BasicHttpBindingServiceMetadataExchangeEndpointAttribute, que indica a la fábrica de servicios de SharePoint Foundation que cree un extremo de intercambio de metadatos para el servicio de forma automática.

  9. Ahora que la implementación del servicio está lista, puede implementar el servicio en SharePoint Foundation. Haga clic con el botón secundario en el proyecto RevertService, seleccione Agregar y haga clic en Carpeta de SharePoint asignada. Seleccione ISAPI en el cuadro de diálogo Agregar carpeta de SharePoint asignada y, a continuación, haga clic en Aceptar para asignar la carpeta ISAPI del subárbol de SharePoint Foundation al proyecto RevertService. Si Visual Studio crea una subcarpeta RevertService en la carpeta ISAPI del proyecto RevertService, haga clic con el botón secundario en la subcarpeta y haga clic en Quitar para eliminarla.

  10. Para crear un archivo de registro del servicio en la carpeta ISAPI, haga clic en la carpeta ISAPI en el proyecto y, en el menú Proyecto, haga clic en Agregar nuevo elemento. En Plantillas instaladas, seleccione General. Seleccione Archivo de texto, asigne al archivo el nombre Revert.svc y, a continuación, haga clic en Agregar.

  11. Agregue la siguiente declaración de servicio a Revert.svc, que especifica las fábricas de SharePoint Foundation y el espacio de nombres que las contiene. En el ejemplo, MultipleBaseAddressBasicHttpBindingServiceHostFactory especifica la fábrica de servicio para el tipo de servicio web de SOAP. La declaración de clase de servicio también especifica el nombre de la clase de servicio y usa un token para especificar el nombre seguro del ensamblado.

    <%@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" %>
    

    Si va a crear el servicio en Visual Basic, especifique VB en vez de C# como idioma y, en el atributo Service, incluya el nombre del proyecto de SharePoint Foundation, tal como se especifica en el primer paso, como se indica a continuación:

    <%@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. Debido a que Visual Studio 2010 no procesa el tipo de tokens usado en el archivo .svc anterior de manera predeterminada, debe agregar una instrucción adicional en el archivo de proyecto. Guarde todos los cambios en el proyecto, haga clic con el botón secundario en el proyecto RevertService y, a continuación, haga clic en Descargar proyecto. Vuelva a hacer clic con el botón secundario en el nodo RevertService, haga clic en Editar RevertService.csproj o en Editar RevertService.vbproj y agregue una etiqueta <TokenReplacementFileExtensions> como se indica a continuación al primer grupo de propiedades del archivo .csproj o .vbproj para habilitar el procesamiento de tokens en tipos de archivo .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. Después de agregar la etiqueta anterior, guarde el proyecto y cierre el archivo .csproj. En el Explorador de soluciones, haga clic con el botón secundario en el proyecto RevertService y, a continuación, haga clic en Volver a cargar el proyecto.

  14. Para implementar el servicio web personalizado en SharePoint Foundation, en el Explorador de soluciones, haga clic con el botón secundario en el proyecto RevertService y, a continuación, haga clic en Implementar. Visual Studio compila el código del proyecto, genera un archivo WSP e implementa el archivo en el servidor front-end web.

  15. Para usar el servicio web personalizado de la aplicación cliente ProjectTracker, haga clic con el botón secundario en el nodo Referencias de servicio de la aplicación en el Explorador de soluciones y, a continuación, haga clic en Agregar referencia de servicio. En el cuadro de diálogo Agregar referencia de servicio, escriba la dirección URL del servicio WCF personalizado en el cuadro Dirección y especifique MEX como el nombre estándar para el extremo de intercambio de metadatos, como se indica a continuación: https://Server/sites/SiteCollection/MyWebSite/_vti_bin/Revert.svc. Haga clic en Ir para descargar la información de servicio y, a continuación, haga clic en Aceptar para agregar la referencia.

  16. Para agregar un botón Revertir en Form1 para implementar el servicio personalizado, haga clic con el botón secundario en la barra de título del formulario situada junto al botón Guardar y, a continuación, seleccione Botón en la lista desplegable que aparece en pantalla.

  17. En la ventana Propiedades del botón, establezca Estilo de presentación en Texto y escriba Revert como valor para la configuración de Texto.

  18. Haga doble clic en el botón Revertir y agregue el siguiente código de configuración de proxy WCF estándar a su evento Click con una llamada al servicio de WCF personalizado. Para resolver las referencias a ensamblados, haga clic con el botón secundario en los elementos subrayados de color rojo del código, elija Resolver y acepte las referencias de ensamblado recomendadas para el espacio de nombres System.ServiceModel y para el espacio de nombres del servicio de WCF personalizado (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();
    }
    

    Observe que en la llamada al método Revert del ejemplo anterior se especifica el nombre de la lista de SharePoint Foundation y se usa la propiedad Current para devolver el identificador del elemento actualmente seleccionado en el control DataGridView del proyecto. Después de la llamada de servicio web, el código actualiza la interfaz de usuario y vuelve a recuperar datos de SharePoint Foundation.

  19. Presione F5 para ejecutar la aplicación cliente y pruebe el servicio web cambiando un elemento en la DataGridView del proyecto y haciendo clic en el botón Revertir.

Para obtener el ejemplo de código completo Form1, vea Ejemplo completo de Form1 de WCF de SharePoint Foundation.

Vea también

Conceptos

Tutorial: Creación e implementación de un servicio personalizado de WCF en SharePoint Foundation

Servicios WCF en SharePoint Foundation 2010

Otros recursos

Windows Communication Foundation

Configuring Windows Communication Foundation Services