Tutorial: creación de un servicio web personalizado ASP.NET

Última modificación: miércoles, 07 de julio de 2010

Hace referencia a: SharePoint Foundation 2010

En este artículo
Pasos básicos para crear un servicio web ASP.NET
Creación de un servicio web ASP.NET en Visual Studio
Generación y modificación de archivos estáticos WSDL y de detección
Implementación de los archivos de servicio web en el directorio _vti_bin
Inclusión del nuevo servicio web en spdisco.aspx
Creación de una aplicación de Windows para el consumo del servicio web personalizado
Implementación del modelo de objetos de SharePoint Foundation

En esta tarea de programación se proporciona una introducción a la creación de un servicio web personalizado que funciona en el contexto de Microsoft SharePoint Foundation. Muestra paso a paso el proceso de creación de un servicio web simple "Hello World" en Microsoft Visual Studio 2010 y, a continuación, muestra cómo modificar el servicio para que implemente el modelo de objetos del lado servidor de SharePoint Foundation para devolver datos de lista y de sitio.

Nota importanteImportante

Los servicios web personalizados ASP.NET podrán funcionar en SharePoint Foundation 2010, pero se recomienda que cree en su lugar servicios personalizados de WCF. Para obtener más información acerca de los servicios de WCF, consulte Servicios WCF en SharePoint Foundation 2010. Para ver un tutorial que detalla los procedimientos para crear un servicio personalizado de WCF, vea Tutorial: Creación e implementación de un servicio personalizado de WCF en SharePoint Foundation.

Pasos básicos para crear un servicio web ASP.NET

  • Cree un servicio web Microsoft ASP.NET en Visual Studio.

  • Genere y edite un archivo de detección estático y un archivo de Lenguaje de descripción de servicios web (WSDL).

  • Implemente el archivo de servicio web para el directorio _vti_bin.

  • Incluya el servicio web en Spdisco.aspx para que sea reconocible

  • Cree una aplicación cliente para consumir el servicio web.

  • Cree una biblioteca de clases en un servicio web que defina la lógica de programación para el servicio web.

Creación de un servicio web ASP.NET en Visual Studio

El primer paso es crear un sitio de servicio web Microsoft ASP.NET en Visual Studio.

Para crear un servicio Web ASP.NET

  1. En Visual Studio, haga clic en Archivo, seleccione Nuevo y, a continuación, seleccione Sitio web.

  2. En el cuadro de diálogo Nuevo sitio web, seleccione .NET Framework 3.5 como la versión de .NET Framework de destino, seleccione Visual Basic o Visual C# como el lenguaje de programación en Plantillas instaladas, seleccione la plantilla Servicio web ASP.NET, seleccione Sistema de archivos en el cuadro Ubicación web, especifique una ubicación para el proyecto y, a continuación, haga clic en Aceptar.

  3. En la nueva solución del servicio web, cree un proyecto de biblioteca de clases diferente para incluir la lógica del servicio web. Para crear un proyecto, haga clic en Archivo, seleccione Nuevo y, a continuación, seleccione Proyecto.

  4. En el cuadro de diálogo Nuevo proyecto, expanda Visual Basic o Visual C# en Plantillas instaladas, seleccione Biblioteca de clases como la plantilla, proporcione un nombre y una ubicación para el proyecto, seleccione Agregar a la solución en el cuadro Solución y, a continuación, haga clic en Aceptar.

  5. Agregue una referencia al espacio de nombres System.Web.Services en el proyecto de biblioteca de clases. Haga clic con el botón secundario sobre el proyecto en el Explorador de soluciones, haga clic en Agregar referencia, seleccione System.Web.Services en la ficha .NET del cuadro de diálogo Agregar referencia y, a continuación, haga clic en Aceptar.

  6. Reemplace el archivo de clase predeterminado en el proyecto de biblioteca de clases por el archivo de clase de servicio predeterminado proporcionado por Visual Studio en la carpeta App_Code del servicio web.

    Para reemplazar el archivo de clase por el archivo de clase de servicio

    1. En el Explorador de soluciones, arrastre el archivo Service.cs o Service.vb hacia el nodo superior del proyecto de biblioteca de clases.

    2. Elimine el archivo Class1.cs o Class1.vb y elimine también el archivo Service.cs o Service.vb que queda en la carpeta App_Code.

  7. Cree un nombre seguro para la biblioteca de clases:

    1. En el Explorador de soluciones, haga clic con el botón secundario en el proyecto de biblioteca de clases y, a continuación, haga clic en Propiedades.

    2. En el cuadro de diálogo Propiedades, haga clic en Firma, seleccione Firmar el ensamblado y, a continuación, seleccione <Nuevo> en la lista Seleccione un archivo de clave de nombre seguro.

    3. En el cuadro de diálogo Crear clave de nombre seguro, proporcione un nombre de archivo para la clave, desactive la casilla Proteger mi archivo de clave mediante contraseña y, a continuación, haga clic en Aceptar.

  8. Para generar tan sólo el proyecto de biblioteca de clases, haga clic con el botón secundario en el proyecto en el Explorador de soluciones y, a continuación, haga clic en Generar.

  9. Para agregar el ensamblado a la memoria caché global de ensamblados (GAC), puede arrastrar el ensamblado al directorio %windows%\assembly mediante dos instancias del Explorador de Windows o puede usar gacutil.exe, la herramienta de línea de comandos que se instala con el kit de desarrollo de software de Microsoft .NET Framework 2.0.

    Para usar gacutil.exe para copiar la DLL de biblioteca de clases en la GAC

    1. Para abrir un símbolo del sistema de Visual Studio, haga clic en Inicio, seleccione Todos los programas, haga clic en Microsoft Visual Studio 2010, seleccione Herramientas de Visual Studio y, a continuación, haga clic con el botón secundario en Símbolo del sistema de Visual Studio (2010) y haga clic en Ejecutar como administrador.

    2. En el símbolo del sistema, escriba el siguiente comando y presione ENTRAR.

      gacutil.exe -if "<Full file system path to DLL>".

  10. Ahora ya puede cambiar la información del ensamblado en el archivo predeterminado Service.asmx del servicio web mediante la información sobre el archivo DLL que puede encontrar en la GAC. Para obtener información de la GAC, abra el directorio %windows%\assembly en el Explorador de Windows, haga clic con el botón secundario en el ensamblado y, a continuación, haga clic en Propiedades.

  11. Para abrir Service.asmx en el Explorador de soluciones, haga clic con el botón secundario en el archivo y haga clic en Abrir.

  12. Quite el atributo CodeBehind de la directiva de página en Service.asmx y modifique el contenido del atributo Class de forma que la directiva coincida con el formato siguiente, donde el nombre del ensamblado "MyServiceAssembly" y el token de clave pública son valores especificados en el cuadro de diálogo Propiedades que abrió en el Paso 10.

    <%@ WebService Language="C#" Class="Service, MyServiceAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=8f2dca3c0f2d0131" %>
    

    En Visual Basic, incluya el espacio de nombres para identificar la clase, por ejemplo, Class="MyServiceNamespace.Service, MyServiceAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=8f2dca3c0f2d0131".

  13. Cambie el nombre del archivo .asmx del modo correspondiente y guarde los cambios.

Generación y modificación de archivos estáticos WSDL y de detección

Para proporcionar la detección y la descripción para el servicio web personalizado, debe crear un archivo .disco y un archivo .wsdl. Debido a que SharePoint Foundation virtualiza sus direcciones URL (por ejemplo, http://MyServer/MySite/MySubsite se convierte en http://MyServer), no puede usar los archivos .disco y .wsdl que ASP.NET generó automáticamente. En su lugar, debe crear una página .disco y una página ASPX .wsdl que proporcionen la redirección necesaria y mantengan la virtualización.

Puede usar ASP.NET para generar los archivos .disco y .wsdl mediante el hospedaje temporal del servicio web en un directorio virtual, como /_layouts y, a continuación, usar la herramienta de detección de servicios web (Disco.exe) de Microsoft .NET Framework para obtener los archivos generados.

Para generar y editar los archivos estáticos WSDL y de detección

  1. En el Explorador de Windows, copie el archivo .asmx del servicio web en %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\LAYOUTS.

  2. Ejecute Disco.exe en el símbolo del sistema del directorio LAYOUTS para generar los archivos .disco y .wsdl. Ejecute un comando con el formato siguiente para generar los archivos en \LAYOUTS:

    disco http://MyServer/_layouts/MyCustomWebService.asmx

  3. Para registrar los espacios de nombres del modelo de objetos de SharePoint Foundation, abra los archivos .disco y .wsdl, y reemplace la instrucción de procesamiento XML de apertura, <?xml version="1.0" encoding="utf-8"?>, por instrucciones como las siguientes.

    <%@ Page Language="C#" Inherits="System.Web.UI.Page" %> 
    <%@ Assembly Name="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> 
    <%@ Import Namespace="Microsoft.SharePoint.Utilities" %> 
    <%@ Import Namespace="Microsoft.SharePoint" %>
    <% Response.ContentType = "text/xml"; %>
    
  4. En el archivo .disco, modifique la referencia de contrato y las etiquetas de dirección SOAP para que sean como en el siguiente ejemplo, en el cual se reemplazan las rutas de acceso a los literales por las rutas de acceso a código generadas mediante la clase Microsoft.SharePoint.Utilities.SPHttpUtility. Además, en el ejemplo se reemplaza el nombre del método especificado en el atributo binding.

    <contractRef ref=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request) + "?wsdl"),Response.Output); %> 
    docRef=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %> 
    xmlns="https://schemas.xmlsoap.org/disco/scl/" />
    <soap address=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %> 
    xmlns:q1="http://tempuri.org/" binding="q1:HelloWorld" xmlns="https://schemas.xmlsoap.org/disco/soap/" />
    <soap address=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %> 
    xmlns:q2="http://tempuri.org/" binding="q2:ServiceSoap12" xmlns="https://schemas.xmlsoap.org/disco/soap/" />
    
  5. En el archivo .wsdl, realice la siguiente sustitución similar para la dirección SOAP especificada.

    <soap:address location=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %> />
    
  6. Cambie el nombre de ambos archivos en los formatos respectivos MyCustomWebServicedisco.aspx y MyCustomWebServicewsdl.aspx para que el servicio se pueda detectar con SharePoint Foundation.

Implementación de los archivos de servicio web en el directorio _vti_bin

El directorio virtual _vti_bin se asigna físicamente al directorio %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\ISAPI, el cual contiene los archivos predeterminados de servicio web que se usan en SharePoint Foundation. Copie los archivos nuevos MyCustomWebServicewsdl.aspx y MyCustomWebServicedisco.aspx, y también el archivo MyCustomWebService.asmx, en la carpeta ISAPI.

En el directorio _vti_bin, un servicio web ofrece su funcionalidad al sitio especificado al agregar una referencia web para el servicio.

Para comprobar si el servicio web personalizado se puede detectar, vaya a http://MyServer/_vti_bin/MyCustomWebService.asmx.

Inclusión del nuevo servicio web en spdisco.aspx

Para que el servicio web se pueda detectar en Visual Studio como un servicio web junto con los servicios web predeterminados de SharePoint Foundation, abra el archivo spdisco.aspx que está ubicado en %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\ISAPI, agregue el siguiente código y especifique el archivo .asmx para el servicio web.

<contractRef ref=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(spWeb.Url + "/_vti_bin/MyCustomWebService.asmx?wsdl"), Response.Output); %> 
docRef=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(spWeb.Url + "/_vti_bin/MyCustomWebService.asmx"), Response.Output); %> 
xmlns=" https://schemas.xmlsoap.org/disco/scl/ " />
<discoveryRef ref=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(spWeb.Url + "/_vti_bin/MyCustomWebService.asmx?disco"),Response.Output); %> 
xmlns="https://schemas.xmlsoap.org/disco/" />

Creación de una aplicación de Windows para el consumo del servicio web personalizado

Una vez copiados los archivos de servicios web en el directorio _vti_bin, el siguiente paso es crear una aplicación de Windows para el servicio web personalizado.

Para crear una aplicación de Windows para el consumo del servicio web

  1. Abra Visual Studio y, en el menú Archivo, seleccione Nuevo. A continuación, haga clic en Proyecto.

  2. En el cuadro de diálogo Nuevo proyecto, seleccione Visual C# o Visual Basic y, a continuación, seleccione la plantilla Aplicación de Windows Forms.

  3. Escriba un nombre para la aplicación en el cuadro Nombre, especifique una ubicación para los archivos del proyecto en el cuadro Ubicación y, a continuación, haga clic en Aceptar.

  4. En el Explorador de soluciones, haga clic con el botón secundario en el proyecto y a continuación haga clic en Agregar referencia de servicio.

  5. En el cuadro de diálogo Agregar referencia de servicio, haga clic en Avanzadas y, en el cuadro Configuración de referencia de servicio, haga clic en Agregar referencia web.

  6. En la barra de direcciones del explorador Agregar referencia web, escriba la dirección URL para el sitio al cual se aplica el servicio de la siguiente manera

    https://Server_Name/[sites/][Site_Name/]_vti_bin/MyCustomWebService.asmx

    y, a continuación, presione ENTRAR.

  7. Haga clic en Agregar referencia para descargar el contrato de servicio del servicio web.

  8. Abra Form1 en la vista de diseño, muestre el Cuadro de herramientas y, a continuación, arrastre un botón al formulario.

  9. Haga doble clic en el control Button1 en Form1 para mostrar el archivo de código subyacente en el editor de código y agregue el siguiente código que llama al método personalizado.

    Dim MyCustomService As New Web_Reference_Folder.MyServiceClass()
    MyCustomService.UseDefaultCredentials = True
    MessageBox.Show(MyCustomService.HelloWorld())
    
    Web_Reference_Folder.MyServiceClass MyCustomService = new Web_Reference_Folder.MyServiceClass();
    MyCustomService.UseDefaultCredentials = true;
    MessageBox.Show(MyCustomService.HelloWorld());
    
  10. Presione F5 para compilar y ejecutar el proyecto, y ver un cuadro de mensaje que muestra "Hello World".

Implementación del modelo de objetos de SharePoint Foundation

Ahora ya puede probar los tipos y miembros del modelo de objetos de SharePoint Foundation en la biblioteca de clases de su servicio web.

Para implementar del modelo de objetos de SharePoint Foundation

  1. Agregue una referencia al ensamblado Microsoft.SharePoint. Haga clic con el botón secundario sobre el proyecto de biblioteca de clases en el Explorador de soluciones, haga clic en Agregar referencia, seleccione SharePoint Foundation y, a continuación, haga clic en Aceptar.

  2. En el archivo de proyecto Service.cs o Service.vb, debe importar los espacios de nombres correspondientes en el modelo de objetos. Por ejemplo, para usar los tipos y miembros de los espacios de nombres Microsoft.SharePoint y Microsoft.SharePoint.Utilities, agregue las siguientes directivas.

    Imports Microsoft.SharePoint
    Imports Microsoft.SharePoint.Utilities
    
    using Microsoft.SharePoint;
    using Microsoft.SharePoint.Utilities;
    
  3. Cambie el nombre del método en Service.cs o Service.vb. Por ejemplo, cambie el nombre HelloWorld a GetSiteListCount.

  4. Agregue el siguiente código para mostrar el nombre del sitio web y el número de las listas que contiene.

    Dim myWebSite As SPWeb = SPContext.Current.Web
    Dim lists As SPListCollection = myWebSite.Lists
    
    Return myWebSite.Title + " contains " + lists.Count.ToString() + 
    " lists."
    
    SPWeb myWebSite = SPContext.Current.Web;
    SPListCollection lists = myWebSite.Lists;
    
    return (myWebSite.Title + " contains " + lists.Count.ToString() + 
    " lists.");
    

    Nota

    Si el código modifica los datos de SharePoint Foundation de alguna forma durante la solicitud HttpGet, es posible que necesite permitir que se realicen actualizaciones no seguras en el sitio web. Puede hacer esto mediante el establecimiento de la propiedad AllowUnsafeUpdates.

  5. Para volver a generar el archivo DLL de la biblioteca de clases y copiarla en la GAC, repita los pasos 8 y 9 de "Para crear un servicio web ASP.NET".

  6. Restablezca Internet Information Services (IIS) para que los cambios en la DLL surtan efecto.

  7. Para generar nuevas versiones de los archivos .disco y .wsdl, repita los pasos de "Para generar los archivos estáticos WSDL y de detección", pero cambie el nombre de enlace del método según corresponda en el archivo .disco (por ejemplo, a GetSiteListCount).

  8. Copie las nuevas versiones de los archivos MyCustomWebServicedisco.aspx y MyCustomWebServicewsdl.aspx en la carpeta ISAPI.

  9. Abra la aplicación de Windows creada anteriormente, elimine la referencia del servicio web anterior para el ejemplo Hello World, cambie el nombre de método según corresponda y agregue una referencia web nueva al servicio web revisado.

  10. Presione F5 para compilar y ejecutar el proyecto, y para ver el cuadro de mensaje que muestra el nombre del sitio web y el número de listas que contiene.