SharePoint 2010: ¿Se pueden activar features con el modelo de objetos en cliente?

Esta pregunta es la que me vino a la mente ante una duda que me plantearon hace unos días…mi respuesta fue como en otras ocasiones: “se tiene que poder de alguna forma”…y dicho y hecho, las características se pueden activar de forma programática tanto en el modelo de objetos (MO) en servidor como en cliente:

Si pensamos como activar una feature con el MO Cliente .NET Managed, tendremos que recurrir a la clase FeatureCollection,que nos permite acceder a la colección de características activas en un sitio y activar features existentes que no estén activas de acuerdo al siguiente código:

   1: using System;

   2: using System.Collections.Generic;

   3: using System.Linq;

   4: using System.Text;

   5:  

   6:  

   7: //MO Cliente -> .NET Flavour

   8: using MO_NET = Microsoft.SharePoint.Client;

   9:  

  10: namespace SPFeatureCOMActivation

  11: {

  12:     class Program

  13:     {

  14:         const string sSiteUrl = "http://demo2010a:100/sites/SCR";

  15:         static void Main(string[] args)

  16:         {

  17:             ActivarFeature();

  18:             Console.ReadLine();

  19:         }

  20:         static void ActivarFeature()

  21:         {

  22:             try

  23:             {

  24:                 using (MO_NET.ClientContext ctx =

  25:                     new MO_NET.ClientContext(sSiteUrl))

  26:                 {

  27:                     MO_NET.Web wSite = ctx.Web;

  28:                     MO_NET.FeatureCollection fcFeaturesCollection = wSite.Features;

  29:                     Guid guFeatureGuid = new Guid("bc08fd10-39b5-4a54-b1d9-2eb0aaac47d8");

  30:                     fcFeaturesCollection.Add(

  31:                         guFeatureGuid, true, MO_NET.FeatureDefinitionScope.Site);

  32:  

  33:                     ctx.Load(fcFeaturesCollection);

  34:                     ctx.ExecuteQuery();

  35:  

  36:                     Console.WriteLine("Características instaladas en el sitio: {0}", 

  37:                         fcFeaturesCollection.Count.ToString());

  38:                     foreach (MO_NET.Feature fFeature in fcFeaturesCollection)

  39:                         if (fFeature.DefinitionId == new Guid("bc08fd10-39b5-4a54-b1d9-2eb0aaac47d8"))

  40:                             Console.WriteLine("Feature {0} localizada", fFeature.Tag);                        

  41:                  //       Console.WriteLine("Feature ID: {0}", fFeature.DefinitionId);

  42:                 }

  43:  

  44:             }

  45:             catch (MO_NET.InvalidQueryExpressionException ex)

  46:             {

  47:                 Console.WriteLine("Error: {0}", ex.Message);

  48:             }

  49:             catch (MO_NET.ClientRequestException ex)

  50:             {

  51:                 Console.WriteLine("Error: {0}", ex.Message);

  52:             }

  53:             catch (MO_NET.PropertyOrFieldNotInitializedException ex)

  54:             {

  55:                 Console.WriteLine("Error: {0}", ex.Message);

  56:             }

  57:             catch (MO_NET.ServerUnauthorizedAccessException ex)

  58:             {

  59:                 Console.WriteLine("Error: {0}", ex.Message);

  60:             }

  61:             catch (MO_NET.ServerException ex)

  62:             {

  63:                 Console.WriteLine("Error: {0}", ex.Message);

  64:             }

  65:             catch (Exception ex)

  66:             {

  67:                 Console.WriteLine("Error: {0}", ex.Message);

  68:             }

  69:         }       

  70:     }

  71: }

Como veis, a partir del GUID de la feature resulta muy sencillo su activación sin más que utilizar el método Add() del objeto FeatureCollection definido.