艹蛋客户的艹蛋需求的产物--批量修改web.config文件,同步到各个服务器指定目录下
写这个小软件我实在是迫不得已,我是非常相当的能理解到艹蛋客户的艹蛋的需求。如果有一天我有幸能自己创业,做了老板,又如果做了老板之后能有机会与国企合作,我一定拒绝。我宁愿跟钱过不去不想让自己还有员工去遭那个罪!简直就是无比的艹蛋!我不敢保证这篇随笔会不会成为吐槽!
客户说他们会应上级的要求每个月手动更改数据库的登录密码一次,但是改完了还得改web.config文件呀,这太麻烦了吧,4个站点耶……那得多麻烦呀,那不行,你们得给我们写个小软件,只需要输入密码,点一个按钮就能全部更改过来……(中间省略一万次国骂)。
于是乎,便有了如下的这个界面。
界面不美观,比较简单,我是肯定没有心思去把这个软件做为一个艺术品去开发的。他们要更改的也只是修改密码后更新web.config中的数据库连接字符串。那么整体的思路如下。
Ø 获取用户输入的信息,拼成数据库连接字符串
Ø 将预治的web.config文件用Xpath找到文件中的连接字符串所在的节点
Ø 将拼成的新的连接字符串赋值给web.config文件中的节点属性
Ø 将新的web.config文件保存至本地
Ø 利用Process来调用rsync软件,将配置文件同步到服务器上指定目录(rsync软件的应用,配置)
上面更新配置文件的思路还是比较清晰也比较简单的,界面中还有一个加密密码的文本框,客户要求配置文件中的密码是加过密的,用了最简单的base64加密,不可能用MD5,不可逆的。
Xpath相信各位也不会陌生,很简单的语法就能很精准的找到XML中所需的节点,web.config的本质就是XML文件,只是后缀不是XML而已。
以下方法就是更新配置文件中连接字符串。
//更新配置文件中的连接字符串
public void ChangeConnectionString(ConnectionStringInfo info)
{
string connectionString = string.Empty;
connectionString = "server=" + info.IPAddress + ";database=" + info.DataBase + ";uid=" + info.UserName + ";pwd=" + info.RePassword + ";"; //拼接新的连接字符串
XmlDocument doc = new XmlDocument();
doc.Load(info.Path);
XmlNodeList nodes = doc.SelectNodes("//connectionStrings//add");
foreach (XmlNode node in nodes)
{
node.Attributes["connectionString"].Value = connectionString;
}
FileInfo file = new FileInfo(info.StoragePath);
if (!file.Directory.Exists)
{
file.Directory.Create();
}
doc.Save(info.StoragePath);
}
ConnectionStringInfo中定义了如下的属性
private string _ipAddress; //IP地址
private string _path; //web.config文件存放的路径
private string _userName; //用户名
private string _password; //密码
private string _rePassword; //加密后的密码
private string _dataBase; //数据库名称
private string _storagePath; //配置文件存储路径
文件是成功保存了,但是各站点都没有在本地,难道将更新后保存的配置文件再手动传到指定的服务器上去?那还不如直接手动去服务器上直接更改配置文件。在前面的随笔中有提到rsync同步软件,这里就正好派上用场了,用Process.Start(“path”,”arguments”)调用rsync命令,直接将更新,保存到本地的配置文件同步到指定的服务器上指定的目录上去。这样就一键完成了更新服务器上配置文件的功能。
这样一个小软件我个人认为是复用性不强,估计比这样更艹蛋的客户呢也难找了。不过我一直都是做的B/S,偶尔做做winform当是学习了。这个软件花了三四个小时吧,自认为效率还算可以了,所以就稍微总结了一下,也是从中明白到思路比写程序更加重要。在明确一个功能后,首先在脑子里得有一个比较清晰的思路,而不是知道要做什么后就立马动手去敲代码了,比如说你拿到要求就开始写代码,也没有一个明确的思路,跟着感觉走,或者跟据以往的经验写到哪儿算哪儿,走到哪儿算哪儿。万一该需求跟你的经验就不相同或者表面上相似但实质去是大相径庭,浪费了大量的时间敲代码,后面又不得不推翻重新来过。磨刀是绝不会误了砍柴功的。
虽然代码无法直接复用,当然如果有同样艹蛋的客户,我这个小软件,改改配置文件就可以直接用的。只是觉得我的这样一种思路,这样的一个批量更新的方案自我感觉还算是可以的。
作者: think_fish 发表于 2011-08-09 20:14 原文链接