实例介绍
【实例简介】数据库的部署 站点的建立以及配置
【实例截图】
【实例截图】
【核心代码】
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 "/";
}
}
}
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论