14

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?

2

4 Answers 4

17
// 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;
3
  • 1
    is this guaranteed to contain the root site collection though?
    – Nacht
    Commented Oct 23, 2012 at 23:32
  • This will only work if you have enough permissions to get up to WebApplication level.
    – Jussi Palo
    Commented May 11, 2015 at 12:56
  • Second one should be used. SPContext.Current.Web.Site.Url
    – Aks
    Commented Dec 12, 2016 at 10:53
4

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:

  1. Created a new WebApplication
  2. Created a Site collection under the /sites managed path
  3. 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/>

http://sp2013:32000/sites/first

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)

-1
using (var site = new SPSite("*url*"))    
{ 
   using (SPWeb web = site.RootWeb)    
   {
     string url = web.Site.RootWeb.Url;    
   }
}
1
  • This gets the RootWeb of a Site collection, not the site colleciton under the root URL (/) Commented Apr 6, 2016 at 6:52
-2

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;

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.