With SPContext.Current
I can get the current site or current web. However, I would like to get the root site collection for my current web application. I know that I can get the web application from SPContext.Current.Site.WebApplication but is there a simple way to get the root site collection from that?
-
May I know the reason why you want to refer root site collection directly from the non-root site collection web.– Ravi RanjanCommented May 1, 2015 at 7:56
-
Related: sharepoint.stackexchange.com/questions/2757/…– Alex AngasCommented Jun 2, 2015 at 4:34
4 Answers
// root site – eg. Web App url
string rootSiteCollectionURL = SPContext.Current.Web.Site.WebApplication.Sites[0].Url;
// site collection url
string SiteCollectionURL = SPContext.Current.Web.Site.Url;
-
1is this guaranteed to contain the root site collection though?– NachtCommented Oct 23, 2012 at 23:32
-
This will only work if you have enough permissions to get up to WebApplication level. Commented May 11, 2015 at 12:56
-
The answer of auhcms (https://sharepoint.stackexchange.com/a/39606/41946) is correct, but incomplete.
As it seemed strange to me that the root site collection would always be the first element in the SPWebApplication.Sites collection I decided to do a quick test.
I preformed the following steps:
- Created a new WebApplication
- Created a Site collection under the /sites managed path
- Created a second site collection under the root managed path
When I then checked the first element of the SPWebApplication.Sites collection, it turned out to be in fact the root site collection.
(when initializing the SPSiteCollection collection, SharePoint call the proc_getSiteNames stored procedures. This procedures retrieves the site collections from the database and orders them by 'path'... so the root, if it exists, will be first)
However, it is not required to have a site collection a the root path of the WebApplication. When there is no site collection at the root path, SPWebApplication.Sites[0]
will return another existing site collection.
$site = Get-SPSite http://sp2013:32000/sites/first<br/>
$webapp = $site.WebApplication<br/>
$webapp.Sites[0].Url<br/>
So when an site collection exists at the root path of the webapplication, you can retrieve it using SPWebApplication.Site[0]
.
You can however not be sure that the site collection at SPWebApplication.Site[0]
will always be at the root path of the WebApplication.
To validate if the site collection is as the root, you could check the ServerRelativeUrl property of the SPSite instance:
public SPSite GetRootSiteCollection(SPWebApplication webApp)
{
//no site collections created on this webApp
if (webApp.Sites.Count == 0)
return null;
SPSite site = webApp.Sites[0];
//only return the site collection if it's the root site collection.
if (site.ServerRelativeUrl.Equals("/"))
return site;
return null;
}
(you should dispose the SPSite object when your are done with it)
using (var site = new SPSite("*url*"))
{
using (SPWeb web = site.RootWeb)
{
string url = web.Site.RootWeb.Url;
}
}
-
This gets the RootWeb of a Site collection, not the site colleciton under the root URL (
/
) Commented Apr 6, 2016 at 6:52
Simple way to get the root site collection from SPContext.Current:
// root site – eg. Web App url
string rootSiteCollectionURL = SPContext.Current.Web.Site.WebApplication.Sites[0].Url;
// site collection url
string SiteCollectionURL = SPContext.Current.Web.Site.Url;