Получение ссылок на сайты, веб-приложения и другие ключевые объекты
Дата последнего изменения: 8 апреля 2010 г.
Применимо к: SharePoint Foundation 2010
Для работы с развертыванием Microsoft SharePoint Foundation код сначала должен получить ссылку на объекты, с которыми он будет работать, включая веб-сайты, семейства сайтов и веб-приложения. Для этого существует два метода: один применяется, если код будет использоваться в консольном приложении или приложении Windows; другой — если код будет использоваться в приложении, реализованном в браузере, например, когда в качестве типа проекта Microsoft Visual Studio выбран "Веб-сайт".
![]() |
---|
В большинстве примеров кода в SDK Microsoft SharePoint 2010 используется второй метод, поэтому при создании программы для консольного приложения или приложения Windows необходимо изменить такой код. Инструкции для этого см. в разделе "Консольные приложения и приложения Windows: использование конструкторов объектов" далее в этой теме. |
Приложения, реализованные в браузере: установка контекста сайта
Для работы с развертыванием SharePoint Foundation с помощью приложения, реализованного в браузере, код должен сначала установить контекст сайта или семейства сайтов для запросов, выполняемых на сервер.
Необходимо получить HTTP-контекст запроса в коде. Майкрософт рекомендует делать это с помощью класса Microsoft.SharePoint.SPContext и его методов, как показано в некоторых примерах далее.
Чтобы вернуть текущее семейство сайтов, можно использовать свойство Current.SPContext.Site.
![]() |
---|
Во всех примерах в этой статьи требуется директива using (Imports в Microsoft Visual Basic) для пространства имен Microsoft.SharePoint. |
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, можно использовать свойство Site или Web последнего класса, чтобы получить ссылки, соответственно, на текущее семейство сайтов или веб-сайт. (Или можно использовать свойство Microsoft.SharePoint.WebControls.LayoutsPageBase.Context в качестве параметра методов GetContextWeb(HttpContext) и GetContextSite(HttpContext).) Класс LayoutsPageBase предоставляет некоторые дополнительные функциональные возможности для SharePoint, главным образом связанные с управлением правами пользователей для страницы, которые недоступны в Page.
Например, следующий код при использовании на странице ASPX, наследующей от LayoutsPageBase, (или фоновый код страницы) возвращает ссылку на текущий веб-сайт.
![]() |
---|
В этом примере необходима директива using (Imports в Visual Basic) для пространства имен Microsoft.SharePoint.WebControls. |
Dim oWebSite As SPWeb = this.Web
SPWeb oWebSite = this.Web;
![]() |
---|
Не следует уничтожать объект SPSite или SPWeb, полученный с помощью любого из указанных выше методов. Среда выполнения SharePoint Foundation уничтожит их после закрытия страницы. Вызов метода Dispose или Close этих объектов приведет к непредсказуемому поведению. Это отмечено в различии получения ссылок на эти типы объектов с помощью конструктора, как описано ниже в разделе "Консольные приложения и приложения 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.Local и SPServer.Local. Примером является следующая строка.
Dim oFarm As SPFarm = SPFarm.Local
SPFarm oFarm = SPFarm.Local;
Чтобы использовать любое из свойств Local, необходимо добавить директиву using (Imports в Visual Basic) для пространства имен Microsoft.SharePoint.Administration.
Любой из предыдущих приемов можно использовать не только в веб-приложениях и на страницах .aspx, но также в пользовательских веб-службах и веб-частях.
Консольные приложения и приложения Windows: использование конструкторов объектов
Класс SPContext неприменим в консольных приложениях и приложениях на базе Windows. Если пишется код для такого типа приложений и требуется работать с отдельным семейством сайтов, используйте конструктор SPSite, чтобы создать экземпляр объекта, представляющего семейство сайтов, как показано в следующем примере.
![]() |
---|
Код должен ликвидировать любой объект SPSite или SPWeb, полученный с помощью конструктора. Практические рекомендации содержат нюансы относительно того, когда следует уничтожать объекты 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"))
{
...
}
Если код ссылается на сайт SPSite или SPWeb, его можно использовать для получения ссылок на родительские объекты. В приведенном ниже примере использования данной техники 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;
Избегайте создания объектов SPSite и SPWeb только для получения ссылки на родительский объект. Эти объекты занимают большой объем памяти. Вместо этого, для получения ссылки на веб-приложение используйте статический метод Lookup(Uri) и передайте ему объект SystemUri, созданный с URI веб-приложения. После этого можно получить ссылку на ферму с помощью свойства Farm объекта веб-приложения. (Получить ссылку на удаленную ферму можно с помощью статического метода Open(String).) Свойство ContentDatabases объекта веб-приложения содержит коллекцию баз данных содержимого в веб-приложении. С помощью этого свойства можно получить ссылку на конкретную базу данных содержимого, если известен ее индекс в коллекции. Дополнительные сведения см. в справочном материале по классу SPContentDatabaseCollection. В следующих строках иллюстрируются некоторые эти возможности.
SPWebApplication webApplication = Lookup(new Uri("https://localhost/");
SPFarm farm = webApplication.Farm;
SPContentDatabase content = webApplication.ContentDatabases[0];
См. также
Ссылка
Определение места создания пользовательского приложения
Концепции
Задачи разработки в SharePoint. Практическое руководство.