public async Task<Site> CreateSiteAsync(string applicationName) { using (ServerManager iis = GetServerManager()) { try { var siteBindingCongfigs = new List<IBindingConfiguration>(); var svcSiteBindingCongfigs = new List<IBindingConfiguration>(); if (_context.Configuration != null && _context.Configuration.Bindings != null) { siteBindingCongfigs = _context.Configuration.Bindings.Where(b => b.SiteType == SiteType.Live).ToList(); svcSiteBindingCongfigs = _context.Configuration.Bindings.Where(b => b.SiteType == SiteType.Service).ToList(); } // Determine the host header values List<BindingInformation> siteBindings = BuildDefaultBindings(applicationName, siteBindingCongfigs).ToList(); List<BindingInformation> serviceSiteBindings = BuildDefaultBindings(applicationName, svcSiteBindingCongfigs).ToList(); // Create the service site for this site var serviceSite = CreateSiteAsync(iis, applicationName, GetServiceSite(applicationName), _context.Configuration.ServiceSitePath, serviceSiteBindings); // Create the main site string siteName = GetLiveSite(applicationName); string root = _context.Paths.GetApplicationPath(applicationName); string siteRoot = _context.Paths.GetLiveSitePath(applicationName); string webRoot = Path.Combine(siteRoot, Constants.WebRoot); FileSystemHelpers.EnsureDirectory(webRoot); File.WriteAllText(Path.Combine(webRoot, HostingStartHtml), HostingStartHtmlContents); var site = CreateSiteAsync(iis, applicationName, siteName, webRoot, siteBindings); // Map a path called _app to the site root under the service site MapServiceSitePath(iis, applicationName, Constants.MappedSite, root); // Commit the changes to iis iis.CommitChanges(); var serviceUrls = serviceSite.Bindings .Select(url => String.Format("{0}://{1}:{2}/", url.Protocol, String.IsNullOrEmpty(url.Host) ? "localhost" : url.Host, url.EndPoint.Port)) .ToList(); // Wait for the site to start await OperationManager.AttemptAsync(() => WaitForSiteAsync(serviceUrls.First())); // Set initial ScmType state to LocalGit var settings = new RemoteDeploymentSettingsManager(serviceUrls.First() + "api/settings"); await settings.SetValue(SettingsKeys.ScmType, ScmType.LocalGit); var siteUrls = site.Bindings .Select(url => String.Format("{0}://{1}:{2}/", url.Protocol, String.IsNullOrEmpty(url.Host) ? "localhost" : url.Host, url.EndPoint.Port)) .ToList(); return new Site { ServiceUrls = serviceUrls, SiteUrls = siteUrls }; } catch { try { DeleteSiteAsync(applicationName).Wait(); } catch { // Don't let it throw if we're unable to delete a failed creation. } throw; } } }
public async Task<Site> CreateSiteAsync(string applicationName) { using (var iis = GetServerManager()) { try { // Determine the host header values List<string> siteBindings = GetDefaultBindings(applicationName, _settingsResolver.SitesBaseUrl); List<string> serviceSiteBindings = GetDefaultBindings(applicationName, _settingsResolver.ServiceSitesBaseUrl); // Create the service site for this site string serviceSiteName = GetServiceSite(applicationName); var serviceSite = CreateSiteAsync(iis, applicationName, serviceSiteName, _pathResolver.ServiceSitePath, serviceSiteBindings); // Create the main site string siteName = GetLiveSite(applicationName); string root = _pathResolver.GetApplicationPath(applicationName); string siteRoot = _pathResolver.GetLiveSitePath(applicationName); string webRoot = Path.Combine(siteRoot, Constants.WebRoot); FileSystemHelpers.EnsureDirectory(webRoot); File.WriteAllText(Path.Combine(webRoot, HostingStartHtml), @"<html> <head> <title>This web site has been successfully created</title> <style type=""text/css""> BODY { color: #444444; background-color: #E5F2FF; font-family: verdana; margin: 0px; text-align: center; margin-top: 100px; } H1 { font-size: 16pt; margin-bottom: 4px; } </style> </head> <body> <h1>This web site has been successfully created</h1><br/> </body> </html>"); var site = CreateSiteAsync(iis, applicationName, siteName, webRoot, siteBindings); // Map a path called _app to the site root under the service site MapServiceSitePath(iis, applicationName, Constants.MappedSite, root); // Commit the changes to iis iis.CommitChanges(); var serviceUrls = new List<string>(); foreach (var url in serviceSite.Bindings) { serviceUrls.Add(String.Format("http://{0}:{1}/", String.IsNullOrEmpty(url.Host) ? "localhost" : url.Host, url.EndPoint.Port)); } // Wait for the site to start await OperationManager.AttemptAsync(() => WaitForSiteAsync(serviceUrls[0])); // Set initial ScmType state to LocalGit var settings = new RemoteDeploymentSettingsManager(serviceUrls.First() + "api/settings"); await settings.SetValue(SettingsKeys.ScmType, ScmType.LocalGit); var siteUrls = new List<string>(); foreach (var url in site.Bindings) { siteUrls.Add(String.Format("http://{0}:{1}/", String.IsNullOrEmpty(url.Host) ? "localhost" : url.Host, url.EndPoint.Port)); } return new Site { ServiceUrls = serviceUrls, SiteUrls = siteUrls }; } catch { try { DeleteSiteAsync(applicationName).Wait(); } catch { // Don't let it throw if we're unable to delete a failed creation. } throw; } } }