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