Obtención de referencias a sitios, aplicaciones web y otros objetos clave

Última modificación: jueves, 08 de abril de 2010

Hace referencia a: SharePoint Foundation 2010

Si desea que el código trabaje con una implementación de Microsoft SharePoint Foundation, tal código debe obtener, en primer lugar, una referencia a los objetos con los que debe trabajar, incluidos sitios web, colecciones de sitios y aplicaciones web. Hay dos métodos para lograrlo: uno procede cuando el código se va a usar en una aplicación de consola o basada en Windows, mientras que el otro se aplica si el código se va a usar en una aplicación hospedada en el explorador, como ocurre cuando se elige "sitio web" como tipo de proyecto de Microsoft Visual Studio.

Nota

Dado que la mayor parte del código de ejemplo del Kit de desarrollo de software (SDK) de Microsoft SharePoint 2010 está escrita para una aplicación hospedada en el explorador, deberá cambiarlo si va a escribir para una aplicación de consola o basada en Windows. Para obtener instrucciones sobre cómo llevar esto a cabo, vea "Aplicaciones de consola y de Windows: usar constructores de objetos" más adelante en este tema.

Aplicaciones hospedadas en el explorador: establecer el contexto del sitio

Para trabajar con una implementación de SharePoint Foundation mediante una aplicación hospedada en el explorador, el código debe establecer primero el contexto del sitio o el contexto de la colección de sitios para las solicitudes enviadas al servidor.

Debe obtener el contexto HTTP de la solicitud en el código, Microsoft recomienda que utilice la clase Microsoft.SharePoint.SPContext y sus miembros. A continuación, se incluyen algunos ejemplos.

Para devolver la colección de sitios actual, puede usar la propiedad Current.SPContext.Site.

Nota

En todos los ejemplos de este artículo se requiere una directiva de using (Imports en Microsoft Visual Basic) para el espacio de nombres Microsoft.SharePoint.

Dim oSiteCollection As SPSite = SPContext.Current.Site
SPSite oSiteCollection = SPContext.Current.Site;

Para devolver el sitio web de la solicitud actual, puede usar SPContext.Current.Web.

Dim oWebSite As SPWeb = SPContext.Current.Web
SPWeb oWebSite = SPContext.Current.Web;

De forma alternativa, si el código se incluye en un archivo .aspx o en el código subyacente de un archivo .aspx.cs, puede usar los métodos del objeto SPControl con la propiedad Page.Context como parámetro. Por ejemplo, use el método GetContextWeb(HttpContext) para obtener una referencia al sitio web actual.

Dim oWebSite As SPWeb = SPControl.GetContextWeb(Context)
SPWeb oWebSite = SPControl.GetContextWeb(Context);

Por último, si la página .aspx proviene de LayoutsPageBase en lugar de Page, puede usar las propiedades Site o Web de la clase anterior para obtener las referencias a la colección de sitios o el sitio web actual respectivamente (también puede utilizar la propiedad Microsoft.SharePoint.WebControls.LayoutsPageBase.Context como parámetro de los métodos GetContextWeb(HttpContext) y GetContextSite(HttpContext)). LayoutsPageBase ofrece funcionalidad extra orientada a SharePoint, principalmente a la hora de administrar los derechos de usuario en la página que no está disponible con Page.

Por ejemplo, el código siguiente, cuando se utiliza en una página .aspx que proviene de LayoutsPageBase (o el código subyacente en la página) obtiene una referencia al sitio web actual.

Nota

En el ejemplo se requiere una directiva de using (Imports en Visual Basic) para el espacio de nombres Microsoft.SharePoint.WebControls.

Dim oWebSite As SPWeb = this.Web
SPWeb oWebSite = this.Web;
Nota de precauciónPrecaución

No debe eliminar ningún objeto SPSite o SPWeb obtenido a través de cualquiera de los métodos anteriores. El tiempo de ejecución de SharePoint Foundation los eliminará una vez terminada la página. La llamada al método Dispose o Close de estos objetos tiene resultados impredecibles. Esto constituye un notable contraste con la obtención de referencias a estos tipos de objetos mediante el uso de un constructor, tal como se describe más adelante en este tema en la sección "Aplicaciones de consola y de Windows: usar constructores de objetos". Existen varios matices con respecto a los procedimientos recomendados sobre cuándo deben o no eliminarse los objetos de SharePoint Foundation. Lea detenidamente Eliminación de objetos.

Para devolver el objeto de conjunto de servidores de nivel superior actual, use SPContext.Current.Site.WebApplication.Farm.

Dim oFarm As SPFarm = SPContext.Current.Site.WebApplication.Farm
SPFarm myFarm = SPContext.Current.Site.WebApplication.Farm;

Para devolver el sitio web de nivel superior de la colección de sitios actual, use la propiedad RootWeb.

Dim oTopSite As SPWeb = SPContext.Current.Site.RootWeb
SPWeb oTopSite = SPContext.Current.Site.RootWeb;

La clase SPContext no establece un límite para obtener el objeto actual del tipo que sea. Para ver un ejemplo, puede usar la propiedad SPSite.AllWebs para obtener una referencia a un sitio web distinto del actual. El siguiente código devuelve el contexto de un sitio especificado usando un indizador con la propiedad AllWebs.

Nota de precauciónPrecaución

Deberá eliminar explícitamente las referencias a los objetos que se obtuvieron a través de la propiedad AllWebs. Hay varios matices con respecto a los procedimientos recomendados sobre cuándo deben o no eliminarse los objetos de SharePoint Foundation. Lea detenidamente Eliminación de objetos.

Dim oWebSite As SPWeb = 
    SPContext.Current.Site.AllWebs("myOtherSite")
...
oWebSite.Dispose();
SPWeb oWebSite = SPContext.Current.Site.AllWebs["myOtherSite"];
...
oWebSite.Dispose();

// Even better, take advantage of a "using" block to ensure
// that the object is disposed.
using (SPWeb oWebSite = SPContext.Current.Site.AllWebs["myOtherSite"])
{
...
}

Finalmente, para obtener una referencia al conjunto de servidores o el servidor físico actual, puede usar las propiedades estáticas SPFarm.Local y SPServer.Local. La siguiente línea es un ejemplo.

Dim oFarm As SPFarm = SPFarm.Local
SPFarm oFarm = SPFarm.Local;

Para usar cualquiera de las propiedades Local, debe agregar la directiva using (Imports en Visual Basic) para el espacio de nombres Microsoft.SharePoint.Administration.

Puede usar cualquiera de las técnicas anteriores no sólo en las aplicaciones web y las páginas .aspx, sino también en los servicios web y elementos web personalizados.

Aplicaciones de consola y de Windows: usar constructores de objetos

La clase SPContext no tiene relevancia en una aplicación de consola o basada en Windows. Si va a escribir código para alguno de estos tipos de aplicaciones y desea trabajar con una colección de sitios concreta, use el constructor SPSite para crear una instancia de un objeto que represente la colección de sitios, como en el siguiente ejemplo.

Nota

El código debe desechar cualquier objeto SPSite o SPWeb obtenido mediante un constructor. Existen algunos matices sobre las mejores prácticas relativos al momento en que los objetos de SharePoint Foundation deben desecharse o no. Lea detenidamente Eliminación de objetos.

Dim oSiteCollection As New SPSite("https://localhost")
...
oSitecollection.Dispose();
SPSite oSiteCollection = new SPSite("https://localhost");
...
oSitecollection.Dispose();

// Even better, take advantage of a "using" block to ensure
// that the object is disposed.
using (SPSite oSiteCollection = new SPSite("https://localhost"))
{
...
}

Nota

"Localhost" es un alias de Windows relativo al equipo en el que está ejecutando el código. Para aplicaciones de consola, Microsoft recomienda usar siempre "localhost" en lugar del nombre real del servidor. Esto se debe a que, en cualquier caso, una aplicación de consola solo puede funcionar en el equipo local. Si codifica un nombre de servidor de forma rígida, como "MyServer", la aplicación de consola no se podrá transportar a otro equipo y las aplicaciones de consola se interrumpirán si alguna vez se cambia el nombre del servidor.

Una vez que tenga una referencia a una colección, puede usar la colección AllWebs para obtener una referencia a un sito web concreto de la colección.

Dim oWebSite As SPWeb
oWebSite = mySiteCollection.AllWebs("mySite")
...
oWebSite.Dispose();
SPWeb oWebSite = mySiteCollection.AllWebs["mySite"];
...
oWebSite.Dispose();

// Even better, take advantage of a "using" block to ensure
// that the object is disposed.
using (SPWeb oWebSite = mySiteCollection.AllWebs["mySite"])
{
...
}

Además, puede usar el método OpenWeb, como se muestra en la siguiente línea.

Dim oWebSite As SPWeb
oWebSite = mySiteCollection.OpenWeb("mySite")
...
oWebSite.Dispose();
SPWeb oWebSite = mySiteCollection.OpenWeb("mySite");
...
oWebSite.Dispose();

// Even better, take advantage of a "using" block to ensure
// that the object is disposed.
using (SPWeb oWebSite = mySiteCollection.OpenWeb("mySite"))
{
...
}

Si el código ya tiene una referencia a SPSite o a SPWeb, puede usarla para obtener una referencia a los objetos primarios. Esta técnica se ilustra en las siguientes líneas, en las que mySiteCollection es un objeto SPSite y oWebSite es un objeto SPWeb.

Dim parentSiteCollection As SPSite = oWebSite.Site;
Dim content As SPContentDatabase = mySiteCollection.CurrentDatabase;
Dim webApplication As SPWebApplication = mySiteCollection.WebApplication;
Dim farm As SPFarm = mySiteCollection.WebApplication.Farm;
SPSite parentSiteCollection = oWebSite.Site;
SPContentDatabase content = mySiteCollection.CurrentDatabase;
SPWebApplication webApplication = mySiteCollection.WebApplication;
SPFarm farm = mySiteCollection.WebApplication.Farm;

No obstante, debe evitar construir un objeto SPSite o SPWeb simplemente para obtener una referencia al objeto primario. Estos objetos consumen una gran cantidad de memoria. En cambio, para obtener una referencia a una aplicación web, use el método Lookup(Uri) estático y páselo a un objeto SystemUri que se ha creado con el identificador uniforme de recursos (URI) de la aplicación web. A continuación, podrá obtener una referencia al conjunto o granja de servidores usando la propiedad Farm del objeto de la aplicación web (puede obtener una referencia a una granja de servidores remota a través del método Open(String) estático). La propiedad ContentDatabases del objeto de la aplicación web contiene una colección de las bases de datos de contenido de la aplicación web. Esta propiedad permite obtener una referencia a una de estas bases de datos en particular, si conoce el índice correspondiente en la colección. Para obtener más información, vea el tema de referencia para la clase SPContentDatabaseCollection. Las siguientes líneas ilustran algunos de estos puntos.

SPWebApplication webApplication = Lookup(new Uri("https://localhost/");
SPFarm farm = webApplication.Farm;
SPContentDatabase content = webApplication.ContentDatabases[0];

Vea también

Referencia

Determinación de la ubicación de creación de una aplicación personalizada

Conceptos

Eliminación de objetos

Tareas de desarrollo de SharePoint: procedimiento para...

Otros recursos

Tareas básicas del modelo de objetos