Host-Named Site Collections (Provisioning by Code and in Specific Content Database)

2 minute read

Host-named site collections are the preferred method to deploy sites in SharePoint 2013.

Because the Office 365 environment uses host-named site collections, new features are optimized for these site collections and they are expected to be more reliable.

Creating Host Named site collection in a on premise environment still needs to be done with the use of PowerShell.

New-SPSite 'http://dev.sharepoint.local' -HostHeaderWebApplication 'http://webapplication.sharepoint.local’ -Name 'Host-Named Site Collection' -Description 'My First Host-Name Site Collection' -OwnerAlias 'SharePoint\spadmin' -language 1033 -Template 'STS#0'

When you would like to create the specific site collection in a separate content database you could use the following command.

New-SPSite 'http://dev.sharepoint.local' -HostHeaderWebApplication 'http://webapplication.sharepoint.local’ -Name 'Host-Named Site Collection' -Description 'My First Host-Name Site Collection' -OwnerAlias 'SharePoint\spadmin' -language 1033 -Template 'STS#0' -ContentDatabase 'SP2013_Content_HostNamed'

For more information on the out of the box functionalities:

If you work in a environment were site need to be provisioned  you will have to create a solution to create host-named site collections.

But how do you create host-named site collection by using code (C#).

At first you will have to get a reference to the web application were in you would like to create the host-named site collection. After that you can just use the ‘Add’ method on the ‘Sites’ collection.

SPWebApplication webApp = SPWebApplication.Lookup(new Uri("http://webapplication.sharepoint.local"));
SPSite Site = webApp.Sites.Add("http://dev.sharepoint.local", "Host-Named Site Collection","My First Host-Name Site Collection", 1033, "STS#0", "SharePoint\spadmin", "SharePoint Administrator", "spadmin@sharepoint.local", "SharePoint\poweruser”,"Power User", "poweruser@sharepoint.local", true);

But what should you do if you would like to create a host-named site collection in a specific content database in C#.

bool retVal = false;
SPWebApplication webApp = SPWebApplication.Lookup(new Uri(hostheaderApplication));
SPContentDatabase newDatabase = null;

if (webApp != null) {

    bool continueValue = false;
    if (!string.IsNullOrEmpty(contentDatabase)) {
        //check if database exists
        var query = from SPContentDatabase database in webApp.ContentDatabases
                    where database.Name == contentDatabase
                    select database;

        newDatabase = query.FirstOrDefault();
        continueValue = newDatabase == null ? false : true;
    } else {
        continueValue = true;
    }

    if (continueValue) {
        SPSite createdSite = webApp.Sites.Add(url, name, description, languageId, template, ownerAlias, string.Empty, string.Empty, ownerAlias, string.Empty, string.Empty, true);

        SPContentDatabase database = createdSite.ContentDatabase;
        if (database.Name != contentDatabase) {
            Dictionary<SPSite, string> failed = new Dictionary<SPSite, string>();

            database.Move(newDatabase, new List<SPSite>() { createdSite }, out failed);

            if (failed.Count > 0) {
                createdSite.Delete();
            } else {
                retVal = true;
            }
        } else {