Crear sitio en SharePoint 2010 mediante el modelo de objeto cliente (Client Object Model)

Aprovechando que el próximo 15 de Junio, se va a celebrar en el CES Microsoft de Navarra un evento sobre SharePoint 2010, en el que participaré junto con mi compañero Raúl Mayo y Juan Carlos González (Ciin), he vuelto “a mis orígenes” vinculados al mundo SharePoint y he estado trabajando en pequeñas aplicaciones relacionadas con el modelo de objetos cliente. Esto me ha permitido conocer de primera mano toda la potencia que presenta esta nueva característica de SharePoint 2010.

A modo de introducción en el tema, vamos a ver que es el modelo de objetos cliente y que características presenta. El modelo de objetos cliente (Client Object Model) se trata de una interfaz de programación (SharePoint 2010) que se ejecuta en los equipos cliente y que permite trabajar con objetos SharePoint de manera remota. Para los que hayamos trabajado con versiones anteriores de SharePoint, esto es una gran ventaja ya que no es necesario tener instalado SharePoint en nuestras máquinas para poder desarrollar aplicaciones para nuestros sitios.

Este modelo presenta las siguientes características:

−El acceso al servidor es vía API

−No hay necesidad de recurrir a los servicios web que expone la plataforma ni de implementar servicios personalizados.

−Permite desarrollar a nivel de:

  • Colecciones de sitios, sitios, plantillas de sitio
  • Listas, elementos de lista, vistas y esquemas
  • Archivos y carpetas
  • Elementos web
  • Seguridad
  • Tipos de contenido

Además, como podemos observar en la siguiente imagen existen tres tipos de clientes con los que se puede trabajar con este modelo de objeto:

 image

1. Cliente .NET

En este caso para poder escribir código del lado cliente, debemos utilizar las bibliotecas de SharePoint que tienen todos los métodos y clases necesarias para comunicarse con el servidor. Microsoft SharePoint 2010 nos proporciona estas dll que se encuentran localizadas en ISAPI y que son:

Microsoft.SharePoint.Client .dll: modelo de objeto en sí mismo

Microsoft.SharePoint.Client.Runtime.dll: lógica de transporte necesaria para procesar las peticiones al servidor

Las comunicaciones entre cliente y el servidor son síncronas.

2. Cliente Silverlight (3.0 o superiores)

En este cliente, al igual que en el anterior, son necesarias una serie de bibliotecas específicas para poder  ejecutar código cliente. Estas están localizadas en TEMPLATELAYOUTSClientBin y son:

Microsoft.SharePoint.Client.Silverlight.dll: modelo de objeto en sí mismo

Microsoft.SharePoint.Client.Silverlight.Runtime.dll: lógica de transporte necesaria para procesar las peticiones al servidor

Al contrario que en el caso anterior, las comunicaciones con el servidor son asíncronas. 

3. Cliente ECMAScript, que se ejecuta en el navegador. Para poder interactuar con él es necesario utilizar:

SP.js: modelo de objeto en sí mismo

SP.Runtime.js: lógica de transporte necesaria para procesar las peticiones al servidor

*Ambos archivos se encuentran localizadas en /LAYOUTS

Las comunicaciones con el servidor son asíncronas, los cambios del servidor no se reflejan automáticamente.

Además también tenemos que tener en cuenta la sintaxis de los objetos SharePoint. Como podemos ver en el siguiente cuadro, esta es diferente si trabajamos con objetos a nivel del servidor o a nivel de modelo objeto cliente.

Servidor

Client MO

SPContext

ClientContext

SPSite

Site

SPWeb

Web

SPList

List

SPListItem

ListItem

SPField

Field

Para entender todo esto un poco mejor vamos a ver un ejemplo del primero tipo de cliente. Para ello vamos a crear una aplicación que nos permita crear programáticamente un sitio SharePoint 2010 mediante el modelo de objetos cliente especifico.

Los pasos que seguimos para ello son:

1. Creamos un proyecto de tipo Consola de aplicación y añadimos las siguientes referencias:

  • Microsoft.SharePoint.Client
  • Microsoft.SharePoint.Client.Runtime

*Estas se encuentran dentro de la ruta C:Program FilesCommon FilesMicrosoft SharedWeb Server Extensions14ISAPI

2. Añadimos el espacio de nombres Microsoft.SharePoint.Client a nuestra clase Program.cs

  1. using Microsoft.SharePoint.Client;

3. Creamos un método llamado CreateSite, y dentro de él:

3.1 Creamos el contexto de nuestro cliente:

  1. ClientContext clientContext = new ClientContext(«http://sharepoint2010:200»);//Creamos contexto del cliente

3.2 Creamos el objeto cliente con una serie de parámetros:

  1. Web oWebsite = clientContext.Web;//Creamos un nuevo sitio dentro del contexto del cliente
  2.             WebCreationInformation webCreateInfo = new WebCreationInformation();//definimos información de creación de sitio
  3.             webCreateInfo.Title = «Sitio Prueba»;//Nombre sitio
  4.             webCreateInfo.Description = «Sitio de equipo»;//Decripción sitio
  5.             webCreateInfo.Url = «SitioPrueba»;//URL sitio
  6.             webCreateInfo.UseSamePermissionsAsParentSite = true;//Permisos sitio
  7.             webCreateInfo.WebTemplate = «STS#0 «;//Tipo de plantilla sitio -> Más información http://www.sharepointdevwiki.com/display/sp2010/Site+Templates+in+SharePoint+2010
  8.             Web oNewWebsite = oWebsite.Webs.Add(webCreateInfo);//Aplicamos los parámetros definidos a nuestro sitio del contexto cliente.

3.3 Creamos la consulta

  1. clientContext.Load(
  2.                 oNewWebsite,
  3.                 website => website.ServerRelativeUrl,
  4.                 website => website.Created);

Como se puede ver, aquí lo que hacemos es cargar el objeto SharePoint oNewWebSite con sus propiedades, e indicamos como parámetros de consulta el valor de la url relativa de nuestro sitio, y la fecha de creación que es lo que mostraremos por consola. 

3.4 Ejecutamos la consulta

  1. clientContext.ExecuteQuery();

Para optimizar la recuperación de datos, el modelo de objetos cliente va poniendo los objetos en cola hasta que no se hace una llamada a ExecuteQuery(). De forma que no hay ningún dato del servidor disponible hasta que no se invoca dicho método. *El método ExecuteQuery() es síncrono.

3.5 Mostramos la información de nuestro sitio por consola

  1. Console.WriteLine(«Server-relative Url: {0} Created: {1}», oNewWebsite.ServerRelativeUrl, oNewWebsite.Created);//Mostramos por consola la información de nuestro sitio
  2.             Console.ReadLine();

 

En resumen, el código completo que hemos utilizado para crear nuestro sitio es:

 

  1. class Program
  2.     {
  3.         static void Main(string[] args)
  4.         {
  5.             CreateSite();
  6.         }
  7.  
  8.         private static void CreateSite()
  9.         {
  10.             ClientContext clientContext = new ClientContext(«http://sharepoint2010:200»);//Creamos contexto del cliente
  11.             Web oWebsite = clientContext.Web;//Creamos un nuevo sitio dentro del contexto del cliente
  12.  
  13.             WebCreationInformation webCreateInfo = new WebCreationInformation();//definimos información de creación de sitio
  14.             webCreateInfo.Title = «Sitio Prueba»;//Nombre sitio
  15.             webCreateInfo.Description = «Sitio de equipo»;//Decripción sitio
  16.             webCreateInfo.Url = «SitioPrueba»;//URL sitio
  17.             webCreateInfo.UseSamePermissionsAsParentSite = true;//Permisos sitio
  18.             webCreateInfo.WebTemplate = «STS#0 «;//Tipo de plantilla sitio -> Más información http://www.sharepointdevwiki.com/display/sp2010/Site+Templates+in+SharePoint+2010
  19.  
  20.             Web oNewWebsite = oWebsite.Webs.Add(webCreateInfo);//Aplicamos los parámetros definidos a nuestro sitio del contexto cliente.
  21.             
  22.             //Cargamos nuestro objeto  
  23.             clientContext.Load(
  24.                 oNewWebsite,
  25.                 website => website.ServerRelativeUrl,
  26.                 website => website.Created);
  27.  
  28.             clientContext.ExecuteQuery();//Ejecutamos la query
  29.  
  30.             Console.WriteLine(«Server-relative Url: {0} Created: {1}», oNewWebsite.ServerRelativeUrl, oNewWebsite.Created);//Mostramos por consola la información de nuestro sitio
  31.             Console.ReadLine();
  32.         }
  33.     }

*Para saber el nombre de las plantillas de sitio que se pueden crear me he ayudado del siguiente enlace donde podemos ver la nomenclatura que se utiliza para las distintas plantillas de SharePoint 2010: http://www.sharepointdevwiki.com/display/sp2010/Site+Templates+in+SharePoint+2010

Si todo ha funcionado correctamente nos aparecerá el siguiente mensaje por consola indicándonos la url del nuevo sitio y la fecha de creación del mismo, tal y como lo hemos indicado.

image

Por último podremos acceder a nuestro sitio a través de la ruta especificada, que en nuestro caso es: http://sharepoint2010:200/SitioPrueba, donde podemos ver que este sitio cuenta con todos los parámetros definidos en su creación (Título, Descripción, Permisos…).

image

Información relacionada:

http://www.codeproject.com/Articles/60294/SharePoint-2010-Managed-net-Client-with-Client-Obj.aspx

http://praveenbattula.blogspot.com/2010/03/sharepoint-2010-client-object-model.html

http://www.tonstegeman.com/Blog/Lists/Posts/Post.aspx?List=70640fe5%2D28d9%2D464f%2Db1c9%2D91e07c8f7e47&ID=118

Configurar “permiso” para recrear tablas en VS 2010

Trabajando en una aplicación web de gestión de productos me he encontrado con que, en una de las tablas de mi base de datos, olvidé definir uno de los campos necesarios . A posteriori he ido a añadirlo y  VS no me dejaba guardar las nuevas tablas con los cambios realizados…¡¡Ya no me acordaba de esto!!!.

Por temas de seguridad VS 2010 esta configurado, por defecto, de forma que no permite rehacer las tablas una vez creadas, algo lógico por una parte. Pero si trabajamos con nuestras propias bases de datos, nos damos cuenta que en un gran numero de casos es necesario realizar algún tipo de modificación. Para que esto sea posible es necesario modificar un parámetro de la configuración de VS 2010. Para ello accedemos a Tools ->Options

image

Y dentro de la pestaña DataBase Tools > Table and DataBase Designers tenemos que quitar la selección del checkbox que indica ”Prevent saving changes that require table re-creation” tal y como se observa en la imagen.

image

De esta forma ya podemos trabajar sobre nuestras tablas sin ningún tipo problema.

😉

Personalizar el enrutamiento de nuestra aplicación ASP.NET MVC

Por defecto cuando creamos una aplicación ASP.NET MVC se define una tabla de enrutamiento que se encarga de decidir que controlador gestiona cada petición Web basándose en la URL de dicha petición. Esta forma de enrutamiento presenta dos grandes ventajas con respecto a las aplicaciones tradicionales de ASP.NET:

1. En cada petición URL no se asigna un archivo físico del disco como una página .aspx, sino que se asigna una acción de un controlador (más un parámetro), que nos mostrará una vista específica.

2. Las rutas son lógicas, es decir, siguen la estructura definida en la tabla de enrutamiento, lo que favorece y facilita la gestión de la navegación en nuestro sitio.

A continuación, podemos ver la tabla de enrutamiento que se genera por defecto al crear una aplicación ASP.NET MVC. Esta tabla de enrutamiento se implementa en el archivo global.asax, y esta definida de la siguiente manera:

 

  1. routes.IgnoreRoute(«{resource}.axd/{*pathInfo}»);
  2.  
  3.             routes.MapRoute(
  4.                 «Default»,                                              // Route name
  5.                 «{controller}/{action}/{id}»,                           // URL with parameters
  6.                 new { controller = «Home», action = «Index», id = «»// Parameter defaults
  7.             );

Si implementamos nuestra aplicación, sin modificar este enrutado, podemos comprobar que, según los parámetros iniciales, se toma por defecto el controlador Home, y la acción Index (tenga o no identificador) como se puede observar en las siguientes imágenes:

image image

Esto funciona así ya que la cadena «Home» se convierte en el parámetro del controlador {controller}, y la cadena «Index» en el parámetro de la acción {action}

Si en nuestra aplicación vamos a utilizar varios controladores nos interesa definir sus rutas de forma individual. Para ello vamos a ver un pequeño ejemplo de como se podría personalizar nuestra tabla de enrutamiento. En nuestro caso, partimos de un proyecto ASP.NET MVC creado para la gestión de libros y al que queremos añadir la posibilidad de gestionar música. Para ello añadimos un nuevo controlador que se llamará Music, y que contará con una acción Category que simplemente nos tiene que mostrar un texto plano en el que ponga la categoría de la música que estamos indicando a través de la URL.

El código que utilizaremos para definir el enrutamiento de nuestra aplicación de música será el siguiente (siguiendo la estructura básica):

  1. routes.MapRoute(
  2.                 «Musica»,                                                         
  3.                 «{controller}/{action}/{categoria}»,                              
  4.                 new { controller = «Music», action = «Category», categoria = «»
  5.             );

Y dentro de nuestro controlador añadiremos el código:

 

  1. public string Category(string categoria)
  2.         {
  3.  
  4.             return «Categoría: « + «<b>»+ categoria + «</b>»;
  5.  
  6.         }

 

Al compilar nuestra aplicación podemos comprobar que si ejecutamos la ruta especificada para nuestro apartado de música, pasándole un parámetro de tipo categoría como puede ser Jazz, se nos muestra el resultado definido a través de la acción Category.

image

Este es un ejemplo muy simple, pero a la vez es extensible a cualquier tipo de aplicación más compleja. Para profundizar en el tema y ver más opciones referentes al mismo, aquí os dejo una página muy útil para introducirse en el mundo del enrutamiento con ASP.NET, en general, y también para MVC. Os recomiendo echarle un vistazo, ya que a mi me a servido muchísimo para ponerme al día con este tema…;)

Otras fuentes:

http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx (depuración de enrutamiento)