基本信息
源码名称:C#批量部署站点(包含数据库部署以及iis建站/配置站点)源码下载
源码大小:0.12M
文件格式:.zip
开发语言:C#
更新时间:2015-05-07
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 2 元 
   源码介绍
数据库的部署 站点的建立以及配置


using System.Collections.Generic;

namespace Deploy
{
	using System;
	using System.IO;
	using System.IO.Compression;
	using System.Configuration;
	using System.Xml;
	using System.Xml.Linq;
	using Microsoft.Web.Administration;
	using System.Linq;

	internal class DeployHelper
	{
		private ServerManager _manager;
		private ServerManager Manager {
			get {
				return _manager ?? (_manager = new ServerManager());
			}
		}

		private readonly string _dbConnectionString;
		private readonly string _applicationPoolName;
		private readonly string _cacheStorage;
		private readonly string _dataSource;
		private readonly string _directory;
		private readonly string _networkDirectory;
		private readonly string _redisHost;
		private readonly string _siteName;
		private readonly string _redisConnectionString;
		private readonly string _redisDefaultDb;

		private readonly int _configurations;

//		private readonly Dictionary<string, object> _appSettings;

		private readonly LogHelper _logHelper;

		public DeployHelper(bool logEnabled = false) {
			_dbConnectionString = ConfigurationManager.AppSettings["DbConnectionString"];
			_applicationPoolName = ConfigurationManager.AppSettings["ApplicationPoolName"];
			_cacheStorage = ConfigurationManager.AppSettings["CacheStorage"];
			_dataSource = ConfigurationManager.AppSettings["DataSource"];
			_directory = ConfigurationManager.AppSettings["Directory"];
			_networkDirectory = ConfigurationManager.AppSettings["NetworkDirectory"];
			_redisHost = ConfigurationManager.AppSettings["RedisHost"];
			_siteName = ConfigurationManager.AppSettings["SiteName"];
			_redisConnectionString = ConfigurationManager.AppSettings["RedisConnectionString"];
			_redisDefaultDb = ConfigurationManager.AppSettings["RedisDefaultDb"];
			_configurations = 1;
			Int32.TryParse(ConfigurationManager.AppSettings["Configurations"], out _configurations);
			_logHelper = new LogHelper(logEnabled);
		}

		private void PrepareArchive(string sourceArchive, string siteName) {
			var extractPath = string.Concat(_directory, siteName);
			if (!Directory.Exists(extractPath)) {
				_logHelper.LogStart("PrepareArchive");
				var sourceArchiveName = Path.GetFileName(sourceArchive);
				var cachePath = string.Concat(_cacheStorage, sourceArchiveName);
				if (!File.Exists(cachePath)) {
					File.Copy(sourceArchive, cachePath);
				}
				ZipFile.ExtractToDirectory(cachePath, extractPath);
				_logHelper.LogEnd();
			} else {
				throw new IOException("Extract Directory Is Not Empty");
			}
		}

		private void PrepareApplicationPool() {
			_logHelper.LogStart("PrepareApplicationPool");
			var pool = Manager.ApplicationPools[_applicationPoolName];
			if (pool == null) {
				throw new Exception("Application Pool Does Not Exist");
				/*pool = Manager.ApplicationPools.Add(_applicationPoolName);
				pool.Recycle();*/
			}
			_logHelper.LogEnd();
		}

		private void PrepareSite(string siteName) {
			_logHelper.LogStart("PrepareSite");
			var rootSite = Manager.Sites[_siteName];
			if (rootSite == null) {
				throw new Exception("Root Site Does Not Exist");
			}
			if (rootSite.Applications.Any(application => application.Path.Contains(siteName))) {
				throw new Exception("Application Already Exists");
			}
			var physicalPath = string.Concat(_directory, siteName);
			var webAppLoader = rootSite.Applications.Add("/"   siteName, physicalPath);
			webAppLoader.ApplicationPoolName = _applicationPoolName;
			for (int configuration = 0; configuration < _configurations; configuration  ) {
				var webApp = rootSite.Applications.Add("/"   siteName   "/"   configuration, physicalPath   "\\Terrasoft.WebApp");
				webApp.ApplicationPoolName = _applicationPoolName;
			}
			_logHelper.LogEnd();
		}

		private void ConfigSite(string siteName) {
			_logHelper.LogStart("ConfigSite");
//			ConfigWithLinq(siteName);
			ConfigWithXml(siteName);
			_logHelper.LogEnd();
		}

		private void ConfigWithXml(string siteName) {
			var connectionStrings = new XmlDocument();
			var filename = _directory   siteName   "\\ConnectionStrings.config";
			connectionStrings.Load(filename);

			XmlNodeList nodes = connectionStrings.SelectNodes("/connectionStrings/add");

			if (nodes == null) {
				return;
			}
			foreach (XmlNode node in nodes) {
				if (node.Attributes == null) {
					continue;
				}
				var nameAttribute = node.Attributes["name"];
				if (nameAttribute != null && nameAttribute.Value == "db") {
					var connectionStringValue = string.Format(_dbConnectionString, _dataSource, siteName);
					node.Attributes["connectionString"].Value = connectionStringValue;
				}
				if (nameAttribute != null && nameAttribute.Value == "redis") {
					var connectionStringValue = string.Format(_redisConnectionString, _redisHost, _redisDefaultDb);
					node.Attributes["connectionString"].Value = connectionStringValue;
				}
			}
			connectionStrings.Save(filename);
		}

		private void ConfigWithLinq(string siteName) {
			var connectionStrings = XDocument.Load(_directory   siteName   "\\ConnectionStrings.config");
			var query = from section in connectionStrings.Descendants("add")
						where section.Attribute("name").Value == "db"
						select section;
		}

		private void PrepareDb(string siteName) {
			_logHelper.LogStart("PrepareDb");
			var initialCatalog = "master";
			var path = string.Concat(_networkDirectory, siteName, "\\db");
			var fileName = Directory.EnumerateFiles(path, "*.bak", SearchOption.TopDirectoryOnly).Select(Path.GetFileName).First();
			var connectionStringValue = string.Format(_dbConnectionString, _dataSource, initialCatalog);
			DbHelper.RestoreDb(connectionStringValue, siteName, path, fileName);
			_logHelper.LogEnd();
		}

		public string Deploy(string sourceArchive, string siteName) {
			PrepareArchive(sourceArchive, siteName);
			PrepareApplicationPool();
			PrepareSite(siteName);
			ConfigSite(siteName);
			PrepareDb(siteName);
			Manager.CommitChanges();
			return @"http://p-tarasov:84/"   siteName   "/";
		}

	}
}