Compartir a través de


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

Para trabajar con una implementación de Windows SharePoint Services, el código debe obtener en primer lugar una referencia a los objetos con los que va a trabajar, incluidos los sitios web, las colecciones de sitios y las aplicaciones web. Hay dos métodos para esto: uno se aplica si el código se va a usar en una aplicación de consola o basada en Windows y el otro se aplica si el código se va a usar en una aplicación alojada en el explorador, como ocurre cuando se elige "Sitio Web" como tipo de proyecto de Microsoft Visual Studio.

Nota

Dado que en la mayor parte del código de ejemplo del SDK de Windows SharePoint Services se usa el segundo método, si va a escribir para una aplicación de consola o basada en Windows, debe cambiar el código. Para obtener instrucciones, consulte la sección "Aplicaciones de consola y de Windows: usar constructores de objetos" más adelante en este tema.

Aplicaciones alojadas en el explorador: establecer el contexto del sitio

Para trabajar con una implementación de Windows SharePoint Services mediante una aplicación alojada 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 volver a la colección de sitios actual, puede usar la propiedad SPContext.Current.Site.

Nota

En todos los ejemplos de este artículo se requiere una directiva de using (Imports en 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 en un archivo .aspx.cs, puede usar los métodos del objeto SPControl con la propiedad System.Web.UI.Page.Context como parámetro. Por ejemplo, use el método GetContextWeb 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 vez de System.Web.UI.Page, puede utilizar las propiedades Site o Web de la clase anterior para obtener las referencias respectivamente a la colección de sitios o el sitio web actual. (O bien puede utilizar la propiedad Microsoft.SharePoint.WebControls.LayoutsPageBase.Context como el parámetro para los métodos GetContextWeb y GetContextSite.) LayoutsPageBase ofrece funcionalidad extra orientada a SharePoint, principalmente en conexión con la gestión de derechos de usuarios para la página que no está disponible con System.Web.UI.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;

Advertencia

No debe desechar ninguna SPSite ni objeto SPWebobtenidos mediante alguno de los métodos anteriores. El motor en tiempo de ejecución de Windows SharePoint Services 3.0 los desechará una vez terminada la página. La llamada al método de desechar o cerrar de estos objetos tendría resultados impredecibles. Esto difiere marcadamente de la obtención de referencias para los tipos de objeto que utilizan un constructor como se describe más adelante en "Aplicaciones de consola y de Windows: usar constructores de objetos". Hay un número de matices sobre las mejores prácticas con respecto al momento en que los objetos de deben desecharse o no. Lea detenidamente Best Practices: Using Disposable Windows SharePoint Services Objects.

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 Microsoft.SharePoint.SPSite.AllWebs para obtener una referencia a un sitio web distinto del actual. La siguiente línea devuelve el contexto de un sitio especificado mediante el uso de un indizador con la propiedad AllWebs.

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

Advertencia

Debe deshacerse explícitamente de las referencias a objetos obtenidos mediante la propiedad AllWebs. Hay un número de matices sobre las mejores prácticas con respecto al momento en que los objetos de deben desecharse o no. Lea detenidamente Best Practices: Using Disposable Windows SharePoint Services Objects.

Finalmente, para obtener una referencia al conjunto de servidores o el servidor físico actual, puede usar las propiedades estáticas Microsoft.SharePoint.Administration.SPFarm.Local y Microsoft.SharePoint.Administration.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 de 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.

Importante

Si instala la "Actualización de infraestructura para Windows SharePoint Services 3.0 (KB951695)", las soluciones personalizadas pueden producir un error si llaman al modelo de objetos de SharePoint mientras se suspende la suplantación. Si se utiliza la autenticación de Windows y el código llama el modelo de objetos de SharePoint desde un proceso de trabajo de IIS, la solicitud debe suplantar la identidad del usuario que realiza la llamada. Windows SharePoint Services configura ASP.NET para suplantar al usuario que realiza la llamada de forma automática, pero el código puede trabajar de forma inesperada, o producir un error, si suspende la suplantación, por ejemplo, llamando a la función RevertToSelf de la API de Windows, o llamando al método System.Security.Principal.WindowsIdentity.Impersonate y pasando IntPtr.Zero como el valor del parámetro token de usuario. Incluso si el código no se revierte de forma explícita, podría llamarse por ASP.NET una vez se revierta, como sucede cuando se implementa un proveedor de ruta de acceso virtual; si el código no suplanta al usuario que llama, podría no funcionar correctamente.

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. Hay un número de matices sobre las mejores prácticas con respecto al momento en que los objetos de Windows SharePoint Services deben desecharse o no. Lea detenidamente Best Practices: Using Disposable Windows SharePoint Services Objects.

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

El "localhost" es un alias de Windows para el equipo en el que está ejecutando el código. Para aplicaciones de consola, Microsoft recomienda utilizar siempre "localhost" en lugar del nombre real del servidor. Esto se debe a que una aplicación de consola sólo puede funcionar en el equipo local de todos modos. Si codifica un nombre de servidor, como "MyServer", entonces la aplicación de consola no se puede transportar a otro equipo y sus 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"))
{
...
}

Vea también

Otros recursos

Best Practices: Using Disposable Windows SharePoint Services Objects
Determinación de la ubicación de creación de una aplicación personalizada
Temas de procedimientos de Windows SharePoint Services
Trabajar con objetos de listas y colecciones
Tareas de ejemplo con modelos de objetos