获取对网站、Web 应用程序和其他关键对象的引用

上次修改时间: 2010年4月8日

适用范围: SharePoint Foundation 2010

要使您的代码处理 Microsoft SharePoint Foundation 部署,该代码必须先获取对必须处理的对象(包括网站、网站集和 Web 应用程序)的引用。可以使用两种方法完成此操作:一种用于将您的代码用于控制台或基于 Windows 的应用程序时;另一种用于将您的代码用于浏览器承载的应用程序时,如当您选择"网站"作为 Microsoft Visual Studio 项目的类型时。

备注

Microsoft SharePoint 2010 软件开发工具包 (SDK) 中的大多数示例代码都是面向浏览器承载的应用程序编写的,因此,如果您要面向控制台或基于 Windows 的应用程序进行编写,则必须更改代码。有关执行此操作的指导,请参阅本主题后面的"控制台和 Windows 应用程序:使用对象构造函数"。

浏览器承载的应用程序:创建网站上下文

若要通过浏览器承载的应用程序使用 SharePoint Foundation 部署,您的代码必须先建立网站上下文或网站集上下文以执行对服务器所做的请求。

必须在代码中获得请求的 HTTP 上下文,Microsoft 建议您使用 Microsoft.SharePoint.SPContext 类及其成员来实现此目的。下面是一些示例。

若要返回当前网站集,您可以使用 Current.SPContext.Site 属性。

备注

本文中的所有示例都要求对 Microsoft.SharePoint 命名空间使用 using 指令(在 Microsoft Visual Basic 中为 Imports)。

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

若要返回当前请求的网站,您可以使用 SPContext.Current.Web。

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

此外,当 .aspx 文件中包含您的代码或 .aspx.cs 文件中包含"隐藏代码"时,可以使用 SPControl 对象的方法,并将 Page.Context 属性作为参数。例如,使用 GetContextWeb(HttpContext) 方法以获取对当前网站的引用。

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

最后,如果您的 .aspx 页继承自 LayoutsPageBase 而非 Page,则可以使用前一个类的 SiteWeb 属性分别获取对当前网站集或网站的引用。(或者,可以将 Microsoft.SharePoint.WebControls.LayoutsPageBase.Context 属性用作 GetContextWeb(HttpContext)GetContextSite(HttpContext) 方法的参数。)LayoutsPageBase 为您提供了一些额外的面向 SharePoint 的功能,这些功能主要用于管理用户对不能与 Page 一起使用的页面所具有的权限。

例如,若在继承自 LayoutsPageBase 的 .aspx 页中使用以下代码(或隐藏在页面中的代码),则将获取对当前网站的引用。

备注

本示例要求对 Microsoft.SharePoint.WebControls 命名空间使用 using 指令(在 Visual Basic 中为 Imports)。

Dim oWebSite As SPWeb = this.Web
SPWeb oWebSite = this.Web;
警告注释警告

应释放通过上述任意方法获取的任何 SPSiteSPWeb 对象。在页面完成后,SharePoint Foundation 运行时将释放这些对象。调用这些对象的 DisposeClose 方法将导致发生不可预知的行为。这与通过使用构造函数来获取对这些类型的对象的引用有显著的不同,如本主题后面的"控制台和 Windows 应用程序:使用对象构造函数"一节所述。应释放和不应释放 SharePoint Foundation 对象的两种情况所对应的最佳做法之间存在大量细微差别。请仔细研读释放对象

若要返回当前的顶级服务器场对象,请使用 SPContext.Current.Site.WebApplication.Farm。

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

若要返回当前网站集的首要网站,请使用 RootWeb 属性。

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

SPContext 类不会限制您获取任何指定类型的当前 对象。例如,您可以使用 SPSite.AllWebs 属性来获取对当前网站之外的网站的引用。下面的代码使用索引器和 AllWebs 属性返回指定网站的上下文。

警告注释警告

明确释放对通过 AllWebs 属性获取的对象的引用。应释放和不应释放 SharePoint Foundation 对象的两种情况所对应的最佳做法之间存在大量细微差别。请仔细研读释放对象

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"])
{
...
}

最后,若要获取对服务器场或当前物理服务器的引用,您可以使用静态属性 SPFarm.LocalSPServer.Local。下面的行是一个示例。

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

若要使用两个 Local 属性之一,您必须为 Microsoft.SharePoint.Administration 命名空间添加 using 指令(在 Visual Basic 中为 Imports)。

您不仅可以在 Web 应用程序和 .aspx 页中使用上面的任何技术,也可以在自定义 Web 服务和 Web 部件中加以使用。

控制台和 Windows 应用程序:使用对象构造函数

SPContext 类在控制台或基于 Windows 的应用程序中没有任何意义。如果您要为这些类型的应用程序编写代码且要使用特定的网站集,需使用 SPSite 构造函数来实例化表示该网站集的对象,如下例所示。

备注

您的代码应释放通过使用构造函数获取的任何 SPSiteSPWeb 对象。应释放和不应释放 SharePoint Foundation 对象的两种情况所对应的最佳做法之间存在大量细微差别。请仔细研读释放对象

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"))
{
...
}

备注

"localhost"是运行代码的计算机的 Windows 别名。对于控制台应用程序,Microsoft 建议您始终使用"localhost"来代替实际服务器名称。这是因为控制台应用程序只能在本地计算机上运行。如果对服务器名称(如"MyServer")进行硬编码,则无法将控制台应用程序移植到另一台计算机,并且服务器名称一旦发生更改,控制台应用程序就将无法运行。

在具有对集合的引用后,您可以使用 AllWebs 集合获取对该集合中特定网站的引用。

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"])
{
...
}

另外,您还可以使用 OpenWeb 方法,如下面的行所示。

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"))
{
...
}

如果您的代码已经具有对 SPSiteSPWeb 的引用,您可以使用它获取对其父对象的引用。下面的行演示了这项技术,其中 mySiteCollection 是 SPSite 对象,oWebSite 是 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;

然而,应该避免仅为了获取对父对象的引用而构造 SPSiteSPWeb 对象。这些对象占用大量内存。实际上,若要获取对 Web 应用程序的引用,应使用静态 Lookup(Uri) 方法并向其传递使用 Web 应用程序的 URI 创建的 SystemUri 对象。然后,可以使用 Web 应用程序对象的 Farm 属性获取对场的引用。(可以使用静态 Open(String) 方法获取对远程场的引用。)Web 应用程序对象的 ContentDatabases 属性包含 Web 应用程序中内容数据库的集合。如果您知道特定内容数据库在集合中的索引,则可以通过此属性获取对特定内容数据库的引用。有关详细信息,请参阅 SPContentDatabaseCollection 类的参考主题。下面的行演示部分上述要点。

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

请参阅

引用

确定在何处生成自定义应用程序

概念

释放对象

SharePoint 开发任务 - 如何实现?

其他资源

基本对象模型任务