SharePoint Online: Uso del modelo de objetos en cliente desde una aplicación ASP.NET!

A raíz de la última formación sobre Office 365, surgió una cuestión en torno a como a trabajar desde una aplicación ASP.NET con el modelo de objetos en cliente. En su momento comenté “qué igual que con una aplicación de escritorio” y precisamente este post trata de demostrar que esto es así (sin entrar en buenas prácticas de codificación, ya que el código se puede mejorar sin duda, sobre todo la parte de threading en ASP.NET y más después de la genial charla de Luis Guerrero en el Codemotion):

  • En Visual Studio 2010, creamos un proyecto de tipo ASP.NET Web Application.
  • Usando el diseñador de ASP.NET, añadimos referencias a los ensamblados para el modelo de objetos en cliente: Microsoft.SharePoint.Client y Microsoft.SharePoint.Runtime.
  • Añadimos una referencia al proyecto que nos permite conectar a SharePoint Online para obtener un contexto de autenticación vía Claims usando el código creado por Robert Bogue que podéis descargar desde este enlace.
image image image
  • A partir de aquí, toca comenzar a codificar un poco. Comenzando con las directivas using necesarias:
   1: using MO_NET = Microsoft.SharePoint.Client;

   2: using System.Net;

   3: using MSDN.Samples.ClaimsAuth;

   4: using System.Data;

   5: using System.Threading;

  • A continuación, añadimos el siguiente código para el manejador del botón que realiza la conexión a SharePoint Online. Cómo véis es aquí dónde tengo que crear un nuevo Thread motivado porque estoy usando el código de Robert Bogue que implica abrir un control de tipo WebBrowser desde el navegador en este caso para recoger las credenciales de Office 365 que introduzca el usuario.
   1: Thread th = new Thread(ConectSPO);

   2: th.SetApartmentState(ApartmentState.STA);

   3: th.Start();

   4: th.Join();

  • En el thread se ejecuta el siguiente código que nos da el contexto de SharePoint Online que necesitamos para poder comenzar a interactuar con el mismo y trabajar con elementos del sitio usando el modelo de objetos en cliente.
   1: void ConectSPO()

   2: {

   3:     try

   4:     {

   5:         string sTargetSite=

   6:             "https://miccantabria.sharepoint.com/sites/O365Camps";

   7:         using (ctx = ClaimClientContext.GetAuthenticatedContext(sTargetSite))

   8:         {

   9:             ctx.Load(ctx.Web); // Query for Web

  10:             ctx.ExecuteQuery(); // Execute

  11:             this.lblInformation.Text =

  12:                 "Conectado al sitio " + ctx.Web.Title;

  13:         }

  14:     }

  15:     catch (Exception ex)

  16:     {

  17:         this.lblInformation.Text =

  18:             "Error: " + ex.Message;

  19:     }

  20: }

  • El código completo para el botón es el siguiente (qué nos permite acceder a la galería de soluciones del sitio):
   1:  

   2:         protected void btnConectar_Click(object sender, EventArgs e)

   3:         {

   4:             try

   5:             {

   6:                 Thread th = new Thread(ConectSPO);

   7:                 th.SetApartmentState(ApartmentState.STA);

   8:                 th.Start();

   9:                 th.Join();

  10:  

  11:                 using (ctx)

  12:                 {

  13:                     if (ctx != null)

  14:                     {

  15:                         DataTable dtSoluciones =

  16:                             new DataTable();

  17:                         dtSoluciones.Columns.Add("ID");

  18:                         dtSoluciones.Columns.Add("Path");

  19:                         dtSoluciones.Columns.Add("Status");

  20:                         DataRow dtrSolucion;

  21:  

  22:                         //Acceso a la galería de soluciones

  23:                         MO_NET.List solutionList = ctx.Site.GetCatalog(121);

  24:  

  25:                         //Acceso al listado de soluciones

  26:                         MO_NET.ListItemCollection licCollection =

  27:                             solutionList.GetItems(MO_NET.CamlQuery.CreateAllItemsQuery());

  28:  

  29:                         //Definición de operación

  30:                         ctx.Load(licCollection);

  31:  

  32:                         //Realización de operación

  33:                         ctx.ExecuteQuery();

  34:  

  35:                         //Procesado de resultados

  36:                         foreach (MO_NET.ListItem li in licCollection)

  37:                         {

  38:                             dtrSolucion = dtSoluciones.NewRow();

  39:                             MO_NET.FieldLookupValue fl =

  40:                                 (MO_NET.FieldLookupValue)li.FieldValues["Status"];

  41:                             //Solución activada o no

  42:                             if (fl != null)

  43:                             {

  44:                                 dtrSolucion["ID"] = li["ID"];

  45:                                 dtrSolucion["Path"] = li["FileRef"];

  46:                                 dtrSolucion["Status"] = "Activada";

  47:                             }

  48:                             else

  49:                             {

  50:                                 dtrSolucion["ID"] = li["ID"];

  51:                                 dtrSolucion["Path"] = li["FileRef"];

  52:                                 dtrSolucion["Status"] = "Desactivada";

  53:                             }

  54:                             dtSoluciones.Rows.Add(dtrSolucion);

  55:                         }

  56:                         this.grdSoluciones.DataSource =

  57:                             dtSoluciones;

  58:                         this.grdSoluciones.DataBind();

  59:  

  60:                     }

  61:                 }

  62:  

  63:             }

  64:             catch (Exception ex)

  65:             {

  66:                 this.lblInformation.Text =

  67:                     "Error: " + ex.Message;

  68:             }

  69:         }

  70:     }

  • Compilamos y comenzamos a probar que todo funciona como se espera:
    • Se piden las credenciales de Office 365.
    • Se accede a la información del sitio (en este caso a la galería de soluciones del sitio).
image image

Referencias:

Publicado por

Juan Carlos González

Juan Carlos es Ingeniero de Telecomunicaciones por la Universidad de Valladolid y Diplomado en Ciencias Empresariales por la Universidad Oberta de Catalunya (UOC). Cuenta con más de 12 años de experiencia en tecnologías y plataformas de Microsoft diversas (SQL Server, Visual Studio, .NET Framework, etc.), aunque su trabajo diario gira en torno a SharePoint & Office 365. Juan Carlos es MVP de Office Servers & Services desde 2015 (anteriormente fue reconocido por Microsoft como MVP de Office 365 y MVP de SharePoint Server desde 2008 hasta 2015), coordinador del grupo de usuarios .NET de Cantabria (Nuberos.Net, www.nuberos.es), co-fundador y coordinador del Grupo de Usuarios de SharePoint de España (SUGES, www.suges.es), así como co-director de la revista gratuita en castellano sobre SharePoint CompartiMOSS (www.compartimoss.com). Hasta la fecha, ha publicado 8 libros sobre SharePoint & Office 365 y varios artículos en castellano y en inglés sobre ambas plataformas.

4 comentarios en “SharePoint Online: Uso del modelo de objetos en cliente desde una aplicación ASP.NET!”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *