/// <summary>
        /// Creates a new web.config file for the specified service instance
        /// </summary>
        /// <param name="configFilePath"></param>
        /// <param name="database"></param>
        /// <param name="servicesName"></param>
        /// <param name="auditSiteSubscriptionId"></param>
        public static void CreateCustomConfig(string configFilePath, BusinessServiceDatabase database, string servicesName, string auditSiteSubscriptionId)
        {
            Create(configFilePath);

            var configuration = Load(configFilePath);
            configuration.AddConnectionString(Constants.ServiceHostConnectionStringName, database.DatabaseConnectionString);
            configuration.AddUpdateProductVersion(ServiceContext.HostSettings.ProductVersion);
            configuration.AddAuditSiteSubscriptionId(auditSiteSubscriptionId);
            configuration.Save();

            IISUtilities.SetServiceInstanceAuth(servicesName, true, true);
        }
        public static void CreateServiceInstance(CreateServiceInstanceRequest request)
        {
            lock (_threadLock)
            {
                // Validate new service instance parameters
                var validationErrors = PreValidateCreateServiceInstance(request);

                if (!string.IsNullOrEmpty(validationErrors))
                    throw new BusinessException(validationErrors);

                if (!request.ValidateOnly)
                {
                    // Provision the business service database
                    var database = new BusinessServiceDatabase(request.DatabaseInstanceName, request.DatabaseName, request.AppPoolUserName, request.ServicesName, request.DatabaseBehavior, request.SampleDataScript);
                    database.Create();
                    database.CreateServiceUser(request.DefaultAdminUserName, request.DefaultAdminUserPassword, 3);
                    database.CreateServiceUser(request.DefaultPublicUserName, request.DefaultPublicUserPassword, 2);

                    // Create services folder structure
                    var auditSiteSubscriptionId = GetEffectiveAuditSiteSubscriptionId(request.AuditSiteSubscriptionId, request.ServicesName);
                    var targetFolder = GetServicesInstancePhysicalPath(request.ServicesName);

                    FileUtilties.CreateDirectory(targetFolder);
                    FileUtilties.Copy(AdminServicesPhysicalPath, targetFolder);

                    // Create IIS configuration
                    IISUtilities.BuildIISEntities(request, targetFolder);

                    // Create web.config file for service instance
                    BusinessServiceConfiguration.CreateCustomConfig(Path.Combine(targetFolder, "Web.config"), database, request.ServicesName, auditSiteSubscriptionId);

                    // Register new instance with auditing service
                    AuditingServiceManager.AddAuditSiteSubscriptionId(auditSiteSubscriptionId);
                    AuditingServiceManager.RestartAuditingService();
                }
            }
        }
示例#3
0
        /// <summary>
        /// Loads the host settings, etc.
        /// </summary>
        private static void ConfigureServiceContext()
        {
            ServiceContext.Logger.Info("Loading Host Settings.");
            ServiceContext.HostSettings.ServicesName = GetServiceName();
            ServiceContext.HostSettings.ApplicationPath = MapBinPath();
            ServiceContext.HostSettings.IsAdminServiceHost = string.IsNullOrEmpty(ServiceContext.HostSettings.ServicesName);

            var config = WebConfigurationManager.OpenWebConfiguration(MapCustomWebConfigFolderVirtualPath());

            ServiceContext.HostSettings.ProductVersion = config.AppSettings.Settings["ProductVersion"].Value;

            if (!ServiceContext.HostSettings.IsAdminServiceHost)
            {
                ServiceContext.HostSettings.ServiceHostDBConnectionString = config.ConnectionStrings.ConnectionStrings["ServiceHost"].ConnectionString;

                var sqlConnection = new SqlConnectionStringBuilder(ServiceContext.HostSettings.ServiceHostDBConnectionString);
                ServiceContext.HostSettings.ServiceHostDBName = sqlConnection.InitialCatalog;
                ServiceContext.HostSettings.ServiceHostDBInstanceName = sqlConnection.DataSource;
                ServiceContext.HostSettings.AuditSiteSubscriptionId = config.AppSettings.Settings["AuditSiteSubscriptionId"].Value;

                var database = new BusinessServiceDatabase(HostingEnvironment.ApplicationPhysicalPath.TrimEnd('\\'), Common.Administration.CreateDatabaseBehavior.ReuseExistingOnly, null);
                ServiceContext.HostSettings.PublicDBUserName = database.PublicDBUserName;
                ServiceContext.HostSettings.PublicDBUserPassword = database.PublicDBUserPassword;
            }
        }
        public static void UpgradeServiceInstances(UpgradeServiceInstancesRequest request)
        {
            lock (_threadLock)
            {
                // Get service instances to upgrade
                var serviceInstances = IISUtilities.GetServiceInstances();

                if (!request.UpgradeAllInstances)
                {
                    request.InstanceNames = request.InstanceNames.Select(n => n.ToLowerInvariant());
                    serviceInstances = serviceInstances.Where(i => request.InstanceNames.Contains(i.ServicesName.ToLowerInvariant()));
                }

                // Upgrade each service instance
                foreach (var serviceInstance in serviceInstances)
                {
                    IISUtilities.StopAppPool(serviceInstance.PhysicalPath);

                    // Update service instance database schema
                    var database = new BusinessServiceDatabase(serviceInstance.PhysicalPath, request.DatabaseBehavior, request.SampleDataScript);

                    if (request.DatabaseBehavior == CreateDatabaseBehavior.DestroyExistingAndCreate)
                        database.Create();
                    else
                        database.Update();

                    // Update service instance files
                    var targetFolder = GetServicesInstancePhysicalPath(serviceInstance.ServicesName);
                    FileUtilties.Copy(AdminServicesPhysicalPath, targetFolder);

                    // Update service instance configuration
                    BusinessServiceConfiguration.UpdateCustomConfig(serviceInstance.PhysicalPath, serviceInstance.ServicesName);

                    IISUtilities.StartAppPool(serviceInstance.PhysicalPath);
                }
            }
        }
        private static string PreValidateCreateServiceInstance(CreateServiceInstanceRequest request)
        {
            var validationErrors = new StringBuilder();
            string validationError = string.Empty;

            if (!ServiceContext.HostSettings.IsAdminServiceHost)
            {
                validationErrors.AppendLine("New service instances can only be created from the admin service instance.");
            }
            else
            {
                // Validate service database creation
                var database = new BusinessServiceDatabase(request.DatabaseInstanceName, request.DatabaseName, request.AppPoolUserName, request.ServicesName, request.DatabaseBehavior, request.SampleDataScript);
                validationError = database.PreValidateCreate();

                if (!string.IsNullOrEmpty(validationError))
                    validationErrors.AppendLine(validationError);

                // Validate target folder for service files
                if (!request.AllowServiceInstanceOverwrite)
                {
                    var targetFolder = GetServicesInstancePhysicalPath(request.ServicesName);

                    if (Directory.Exists(targetFolder))
                        validationErrors.AppendLine(string.Format(CultureInfo.InvariantCulture, "A physical folder for services ({0}) already exists at: {1}", request.ServicesName, targetFolder));
                }

                // Validate IIS configuration for service
                validationError = IISUtilities.PreValidateBuildIISEntities(request);

                if (!string.IsNullOrEmpty(validationError))
                    validationErrors.AppendLine(validationError);

                // Validate Audit configuration
                validationError = AuditingServiceManager.PreValidateAddAuditSiteSubscriptionId();

                if (!string.IsNullOrEmpty(validationError))
                    validationErrors.AppendLine(validationError);
            }

            return validationErrors.ToString();
        }