miércoles, 22 de abril de 2015

Tenga cuidado al invocar el objeto SPSite de incluir la zona

SharePoint desde su versión 2007 cuenta con un modelo de objetos para acceder los recursos y servicios de SharePoint vía programación a través de las soluciones de granja y recientemente en 2013 bajo el modelo de Aplicaciones o Apps.

La clase SPSite representa la colección de sitios dentro de una aplicación web de SharePoint.  Los constructores para instanciar en memoria SPSite son 6 el más utlizado es SPSite(string) donde definimos la dirección URL que deseamos invocar.

Para que necesitamos SPSite, pues bueno para programar en SharePoint debemos de respetar las jerarquías y cualquier objeto dentro de un sitio debemos de accederlo a través de su colección de sitios SPSite y luego de su sitio o subsitio con SPWeb.  Echemos un vistazo en la siguiente gráfica de la jerarquía de objetos en SharePoint.

Donde obtenemos vía programación la URL actual de la aplicación.  Pues es a través de la clase SPConext y sus propiedades Current.Web.URL, esta línea de código completa se lee así: SPContext.Current.Web.URL.

Si combinamos las dos clases para instanciar en memoria la clase SPSite se leería de la siguiente forma en C#:

SPSite miSitio = new SPSite(SPContet.Current.Web.URL);

y la forma correcta es utilizando using de la siguiente forma para que podamos eliminar efectivamente de memoria dicho objeto ya que SharePoint tiene aún dependencia de los servicios COM+ de Windows.  Vea las mejores practicas para utilizar los objetos de SharePoint en https://msdn.microsoft.com/en-us/library/aa973248(v=office.12).aspx

using(SPSite miSitio = new SPSite(SPConext.Current.Web.URL) {

//tu codigo…

}

Otra forma de instanciar en memoria este objeto es a través de su Guid o ID.  De la misma forma que obtenemos la URL Actual así obtenemos el Guid de la colección de sitios con la siguiente línea de comando en C#:

SPContext.Current.Site.ID

El código completo sería de la siguiente forma:

using(SPSite miSitio = new SPSite(SPConext.Current.Site.ID) {

//tu codigo…

}

Pero si la solución que estamos ejecutando esta corriendo sobre HTTPS y no es la zona predeterminada ambos código son dispararán error.   Que podemos hacer?… Pues utilizar el constructor donde podemos definir la zona actual con la siguiente línea de código para obtener la zona:

SPContext.Current.Site.Zone

Entonces el código completo combinando nuestros hallazgos sería el siguiente:

SPSite miSitioId = SPContext.Current.Site.ID;

var miZona = SPContext.Current.Site.Zone;

using(SPSite miSitio = new SPSite(miSitioId, miZona) {

//tu codigo…

}

 

 

y una aplicación típica de código para listar por ejemplo los elementos de una lista se vería de la siguiente forma:

SPSite miSitioId = SPContext.Current.Site.ID;

var miZona = SPContext.Current.Site.Zone;

using(SPSite miSitio = new SPSite(miSitioId, miZona) {

using (SPWeb miWeb = miSitio.OpenWeb()) {

SPList miLista = miWeb.Lists["Tasks"];

SPListItemCollection collItem = miLista.GetItems("Title", "Status");

foreach(SPListItem oItem in collItem) {

Response.Write(SPEncode.HtmlEncode(oItem["Title"].ToString()) + " :: " + SPEncode.HtmlEncode(oItem["Status"].ToString()) + "<BR>");

}

}

}

 

Espero haberles ayudado.

SharePoint4Fun!,

Juan Manuel Herrera Ocheita

No hay comentarios.: