Introducción a la creación de complementos de SharePoint hospedados por el proveedor

Los complementos hospedados por el proveedor son uno de los dos tipos principales de complementos de SharePoint. Para obtener información general sobre los complementos de SharePoint y los dos tipos distintos, vea Complementos de SharePoint.

Aquí tiene un resumen de complementos hospedados por el proveedor:

  • Ofrecen una aplicación web, un servicio o una base de datos que non están hospedados en la granja de servidores de SharePoint ni en la suscripción a SharePoint Online. También pueden incluir los componentes de SharePoint. Los componentes externos pueden hospedarse en cualquier pila de hospedaje web, incluidas las pilas LAMP (Linux, Apache, MySQL y PHP).
  • La lógica empresarial personalizada en el complemento tiene que ejecutarse en componentes externos, o en bien con JavaScript en páginas de SharePoint personalizadas.

En este artículo, completará los pasos siguientes:

  • Configurar el entorno de desarrollo
  • Crear el proyecto de complemento
  • Código del complemento

Configurar el entorno de desarrollo

Hay muchas maneras de configurar un entorno de desarrollo para Complementos de SharePoint. En esta sección se explica la forma más sencilla. Si busca otras alternativas, como la configuración de un entorno “completamente local”, vea Herramientas.

Obtener las herramientas

Consulte las versiones anteriores de Visual Studio u otra documentación de Visual Studio.

Registrarse para obtener una suscripción de Office 365 Developer

Nota:

Podría tener ya acceso a una suscripción de Office 365 Developer:

Para obtener un plan de Office 365:

Abrir el sitio para desarrolladores

Seleccione el vínculo Compilar complementos en la esquina superior izquierda de la página para abrir el sitio para desarrolladores. Debería ver un sitio que se parece al de la figura siguiente. La lista Add-ins in Testing (Complementos de pruebas) en la página confirma que el sitio web se ha realizado con la plantilla del sitio de SharePoint Developer. Si ve un sitio de grupo normal en su lugar, espere unos minutos y, después, reinicie el sitio.

Nota:

Anote la dirección URL del sitio (se usa al crear proyectos de complementos de SharePoint en Visual Studio).

Página principal del sitio para desarrolladores con la lista Complementos en fase de prueba

Captura de pantalla donde se muestra la página principal del sitio para desarrolladores.

Crear el proyecto de complemento

  1. Inicie Visual Studio con la opción Ejecutar como administrador.

  2. En Visual Studio, seleccione Archivo>Nuevo>Proyecto.

  3. En el cuadro de diálogo Nuevo proyecto, expanda el nodo Visual C#, expanda el nodo Office/SharePoint y, después, seleccione Complementos>Complemento de SharePoint.

  4. Asigne el nombre SampleAddIn al proyecto y, después, seleccione Aceptar.

  5. En el cuadro de diálogo Especificar configuración para el complemento de SharePoint, siga este procedimiento:

    • Especifique la dirección URL completa del sitio de SharePoint que quiera usar para la depuración de su complemento. Esta es la dirección URL del sitio para desarrolladores. Use HTTPS en lugar de HTTP en la dirección URL. En algún momento durante este procedimiento o poco después de que finalice, se le pedirá que inicie sesión en este sitio. Los intervalos para pedir confirmación varían. Use las credenciales de administrador (en el dominio *.onmicrosoft.com) que creó al registrarse en el sitio para desarrolladores; por ejemplo MyName@contoso.onmicrosoft.com, .

    • En ¿Cómo desea hospedar el complemento de SharePoint?, seleccione Hospedado por el proveedor.

    • Seleccione Siguiente.

  6. En la página Especifique la versión de destino de SharePoint, seleccione SharePoint Online y, después, seleccione Siguiente.

  7. En ¿Qué tipo de proyecto de aplicación web desea crear?, seleccione Aplicación de formularios Web Forms ASP.NET y, a continuación, seleccione Siguiente.

  8. En ¿Cómo desea que se autentique su complemento?, seleccione Usar Microsoft Azure Access Control Service.

  9. En el asistente, seleccione Finalizar.

    Gran parte de la configuración se realiza cuando se abre la solución. Se crean dos proyectos en la solución Visual Studio, uno para la Complemento de SharePoint y el otro para la aplicación web de ASP.NET.

Código del complemento

  1. Abra el archivo AppManifest.xml. En la pestaña Permisos, especifique el ámbito Colección de sitios y el nivel de permiso Leer.

  2. Elimine cualquier marca dentro de la etiqueta <body> del archivo Pages/Default.aspx de su aplicación web y, a continuación, agregue el HTML siguiente y los controles de ASP.NET dentro de <body>. En este ejemplo se usa el control UpdatePanel para habilitar la representación parcial de la página.

     <form id="form1" runat="server">
       <div>
         <asp:ScriptManager ID="ScriptManager1" runat="server"
                 EnablePartialRendering="true" />
         <asp:UpdatePanel ID="PopulateData" runat="server" UpdateMode="Conditional">
           <ContentTemplate>      
             <table border="1" cellpadding="10">
              <tr><th><asp:LinkButton ID="CSOM" runat="server" Text="Populate Data" 
                                    OnClick="CSOM_Click" /></th></tr>
              <tr><td>
    
             <h2>SharePoint Site</h2>
             <asp:Label runat="server" ID="WebTitleLabel"/>
    
             <h2>Current User:</h2>
             <asp:Label runat="server" ID="CurrentUserLabel" />
    
             <h2>Site Users</h2>
             <asp:ListView ID="UserList" runat="server">     
                 <ItemTemplate >
                   <asp:Label ID="UserItem" runat="server" 
                                     Text="<%# Container.DataItem.ToString()  %>">
                   </asp:Label><br />
                </ItemTemplate>
             </asp:ListView>
    
             <h2>Site Lists</h2>
                    <asp:ListView ID="ListList" runat="server">
                        <ItemTemplate >
                          <asp:Label ID="ListItem" runat="server" 
                                     Text="<%# Container.DataItem.ToString()  %>">
                         </asp:Label><br />
                       </ItemTemplate>
                   </asp:ListView>
                 </td>              
               </tr>
              </table>
            </ContentTemplate>
          </asp:UpdatePanel>
       </div>
     </form>
    
  3. Agregue las siguientes declaraciones al archivo Default.aspx.cs de la aplicación web.

       using Microsoft.SharePoint.Client;
       using Microsoft.IdentityModel.S2S.Tokens;
       using System.Net;
       using System.IO;
       using System.Xml;
    
  4. En el archivo Default.aspx.cs de la aplicación web, agregue estas variables dentro de la clase Page.

      SharePointContextToken contextToken;
      string accessToken;
      Uri sharepointUrl;
      string siteName;
      string currentUser;
      List<string> listOfUsers = new List<string>();
      List<string> listOfLists = new List<string>();
    
  5. Agregue el método RetrieveWithCSOM dentro de la clase Página. Este método usa el CSOM de SharePoint para recuperar información sobre su sitio y mostrarlo en la página.

        // This method retrieves information about the host web by using the CSOM.
      private void RetrieveWithCSOM(string accessToken)
      {
    
          if (IsPostBack)
          {
              sharepointUrl = new Uri(Request.QueryString["SPHostUrl"]);
          }            
    
          ClientContext clientContext =
                          TokenHelper.GetClientContextWithAccessToken(
                              sharepointUrl.ToString(), accessToken);
    
          // Load the properties for the web object.
          Web web = clientContext.Web;
          clientContext.Load(web);
          clientContext.ExecuteQuery();
    
          // Get the site name.
          siteName = web.Title;
    
          // Get the current user.
          clientContext.Load(web.CurrentUser);
          clientContext.ExecuteQuery();
          currentUser = clientContext.Web.CurrentUser.LoginName;
    
          // Load the lists from the Web object.
          ListCollection lists = web.Lists;
          clientContext.Load<ListCollection>(lists);
          clientContext.ExecuteQuery();
    
          // Load the current users from the Web object.
          UserCollection users = web.SiteUsers;
          clientContext.Load<UserCollection>(users);
          clientContext.ExecuteQuery();
    
          foreach (User siteUser in users)
          {
              listOfUsers.Add(siteUser.LoginName);
          }
    
          foreach (List list in lists)
          {
              listOfLists.Add(list.Title);
          }
      }
    
  6. Agregue el método CSOM_Click dentro de la clase Página. Este método desencadena el evento que se produce cuando el usuario hace clic en el vínculo Rellenar datos.

      protected void CSOM_Click(object sender, EventArgs e)
    {
        string commandAccessToken = ((LinkButton)sender).CommandArgument;
        RetrieveWithCSOM(commandAccessToken);
        WebTitleLabel.Text = siteName;
        CurrentUserLabel.Text = currentUser;
        UserList.DataSource = listOfUsers;
        UserList.DataBind();
        ListList.DataSource = listOfLists;
        ListList.DataBind();    
     }
    
  7. En primer lugar, reemplace el método Page_Load existente con este. El método Page_Load usa métodos del archivo TokenHelper.cs para recuperar el contexto del objeto Request y obtener un token de acceso desde Servicio de control de acceso (ACS) de Microsoft Azure.

      // The Page_load method fetches the context token and the access token. 
    // The access token is used by all of the data retrieval methods.
    protected void Page_Load(object sender, EventArgs e)
    {
         string contextTokenString = TokenHelper.GetContextTokenFromRequest(Request);
    
        if (contextTokenString != null)
        {
            contextToken =
                TokenHelper.ReadAndValidateContextToken(contextTokenString, Request.Url.Authority);
    
            sharepointUrl = new Uri(Request.QueryString["SPHostUrl"]);
            accessToken =
                        TokenHelper.GetAccessToken(contextToken, sharepointUrl.Authority)
                        .AccessToken;
    
             // For simplicity, this sample assigns the access token to the button's CommandArgument property. 
             // In a production add-in, this would not be secure. The access token should be cached on the server-side.
            CSOM.CommandArgument = accessToken;
        }
        else if (!IsPostBack)
        {
            Response.Write("Could not find a context token.");
            return;
        }
    }
    
  8. El archivo Default.aspx.cs necesita tener este aspecto cuando termine.

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Web;
      using System.Web.UI;
      using System.Web.UI.WebControls;
    
      using Microsoft.SharePoint.Client;
      using Microsoft.IdentityModel.S2S.Tokens;
      using System.Net;
      using System.IO;
      using System.Xml;
    
      namespace SampleAddInWeb
      {
          public partial class Default : System.Web.UI.Page
          {
              SharePointContextToken contextToken;
              string accessToken;
              Uri sharepointUrl;
              string siteName;
              string currentUser;
              List<string> listOfUsers = new List<string>();
              List<string> listOfLists = new List<string>();
    
              protected void Page_PreInit(object sender, EventArgs e)
              {
                  Uri redirectUrl;
                  switch (SharePointContextProvider.CheckRedirectionStatus(Context, out redirectUrl))
                  {
                      case RedirectionStatus.Ok:
                          return;
                      case RedirectionStatus.ShouldRedirect:
                          Response.Redirect(redirectUrl.AbsoluteUri, endResponse: true);
                          break;
                      case RedirectionStatus.CanNotRedirect:
                          Response.Write("An error occurred while processing your request.");
                          Response.End();
                          break;
                  }
              }
    
              protected void CSOM_Click(object sender, EventArgs e)
              {
                  string commandAccessToken = ((LinkButton)sender).CommandArgument;
                  RetrieveWithCSOM(commandAccessToken);
                  WebTitleLabel.Text = siteName;
                  CurrentUserLabel.Text = currentUser;
                  UserList.DataSource = listOfUsers;
                  UserList.DataBind();
                  ListList.DataSource = listOfLists;
                  ListList.DataBind();
              }
    
              // This method retrieves information about the host web by using the CSOM.
              private void RetrieveWithCSOM(string accessToken)
              {
    
                  if (IsPostBack)
                  {
                      sharepointUrl = new Uri(Request.QueryString["SPHostUrl"]);
                  }
    
                  ClientContext clientContext =
                          TokenHelper.GetClientContextWithAccessToken(
                              sharepointUrl.ToString(), accessToken);
    
                  // Load the properties for the web object.
                  Web web = clientContext.Web;
                  clientContext.Load(web);
                  clientContext.ExecuteQuery();
    
                  // Get the site name.
                  siteName = web.Title;
    
                  // Get the current user.
                  clientContext.Load(web.CurrentUser);
                  clientContext.ExecuteQuery();
                  currentUser = clientContext.Web.CurrentUser.LoginName;
    
                  // Load the lists from the Web object.
                  ListCollection lists = web.Lists;
                  clientContext.Load<ListCollection>(lists);
                  clientContext.ExecuteQuery();
    
                  // Load the current users from the Web object.
                  UserCollection users = web.SiteUsers;
                  clientContext.Load<UserCollection>(users);
                  clientContext.ExecuteQuery();
    
                  foreach (User siteUser in users)
                  {
                      listOfUsers.Add(siteUser.LoginName);
                  }
    
                  foreach (List list in lists)
                  {
                      listOfLists.Add(list.Title);
                  }
              }
    
              protected void Page_Load(object sender, EventArgs e)
              {
                  string contextTokenString = 
                       TokenHelper.GetContextTokenFromRequest(Request);
    
                  if (contextTokenString != null)
                  {
                      contextToken =
                          TokenHelper.ReadAndValidateContextToken(contextTokenString, Request.Url.Authority);
    
                      sharepointUrl = new Uri(Request.QueryString["SPHostUrl"]);
                      accessToken =
                          TokenHelper.GetAccessToken(contextToken, sharepointUrl.Authority)
                                     .AccessToken;
                      CSOM.CommandArgument = accessToken;
                  }
                  else if (!IsPostBack)
                  {
                      Response.Write("Could not find a context token.");
                      return;
                  }
              }
          }
      }
    
    
  9. Use la tecla F5 para implementar y ejecutar el complemento. Si ve una ventana de Alerta de seguridad que le pide que confíe en el certificado autofirmado de Localhost, seleccione .

  10. Seleccione Confiar en la página de consentimiento para conceder permisos al complemento. Visual Studio instalará la aplicación web para IIS Express y, a continuación, instalará el complemento en su sitio de SharePoint de prueba y lo iniciará. Verá una página que muestra la tabla en la siguiente captura de pantalla. Para ver información resumida sobre el sitio de SharePoint, seleccione Rellenar datos.

Página de inicio de aplicación autohospedada básica

Pasos siguientes

Para crear los complementos, siga los pasos siguientes en este orden:

  1. Dar al complemento hospedado por el proveedor la apariencia de SharePoint
  2. Incluir un botón personalizado en el complemento hospedado por el proveedor
  3. Obtener información general rápida sobre el modelo de objetos de SharePoint
  4. Agregar operaciones de escritura de SharePoint en el complemento hospedado por el proveedor
  5. Incluir un elemento de complemento en el complemento hospedado por el proveedor
  6. Controlar eventos de complemento en el complemento hospedado por el proveedor
  7. Agregar lógica de primera vista al complemento hospedado por el proveedor
  8. Implementar con programación un botón personalizado en el complemento hospedado por el proveedor
  9. Controlar eventos de elementos de lista en el complemento hospedado por el proveedor