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:

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s