一、WebService
1.1 编写自动更新WebService
读服务器上关于程序各个版本信息的配置文件UpdateConfig.xml
[WebMethod]
public System.Xml.XmlDocument AppUpdateVertion()
{
System.Xml.XmlDocument xml = new System.Xml.XmlDocument();
xml.Load(CurrentPath("/IEMS_OP_AppUpdate") + @"/UpdateConfig.xml");
return xml;
}
private string CurrentPath(string virtualPath)
{
return HttpContext.Current.Server.MapPath(virtualPath);
}
1.2 UpdateConfig.xml配置文件
配置文件说明:module--模块信息,
version--版本信息,
appUrl--更新文件在服务器存放的路径
<root xmlns="">
<module>
<moduleName>Biz.dll</moduleName>
<version>1.0.0.1</version>
<appUrl>http://localhost/IEMS_OP_AppUpdate/1.0.0.1/Biz.dll</appUrl>
</module>
<module>
<moduleName>CodeList.dll</moduleName>
<version>1.0.0.1</version>
<appUrl>http://localhost/IEMS_OP_AppUpdate/1.0.0.1/CodeList.dll</appUrl>
</module>
</root>
1.3 生成WebService代理类
使用.Net命令行wsdl,生成WebService代理类
二、自动更新程序
2.1 文件下载
private void DownloadFile(string source, string fileName)
{
try
{
System.Net.WebClient myWebClient = new System.Net.WebClient();
myWebClient.DownloadFile(source, fileName);
}
catch (Exception ex)
{
throw new Exception("下载失败,原因是:" + ex.Message, ex);
}
}
2.2 校验版本信息
private void VersionCheck(string desPath, string webServiceAddress)
{
try
{
#region 查看文件和目录
if (!desPath.EndsWith(@"/"))
desPath += @"/";
if (!System.IO.Directory.Exists(desPath))
{
System.IO.Directory.CreateDirectory(desPath);
}
string tempPath = desPath + @"tempDesPathCache/";
if (System.IO.Directory.Exists(tempPath))
{
System.IO.Directory.Delete(tempPath, true);
System.IO.Directory.CreateDirectory(tempPath);
}
else
System.IO.Directory.CreateDirectory(tempPath);
if (!System.IO.File.Exists(desPath + "UpdateConfig.xml"))
{
System.Xml.XmlDocument updateConfig = new System.Xml.XmlDocument();
updateConfig.LoadXml(@"<root></root>");
updateConfig.Save(desPath + "UpdateConfig.xml");
}
#endregion
WebService appUpdate = new WebService();
appUpdate.Url = webServiceAddress;
System.Xml.XmlDocument serverXmlDoc = appUpdate.AppUpdateVertion();
System.Xml.XmlDocument localXmlDoc = new System.Xml.XmlDocument();
localXmlDoc.Load(desPath + "UpdateConfig.xml");
bool newVersionExist = false;
bool moduleExist = false;
System.Xml.XmlNode serverNode0 = serverXmlDoc.ChildNodes[0];
System.Xml.XmlNode localNode0 = localXmlDoc.ChildNodes[0];
foreach (System.Xml.XmlNode serverNode in serverNode0)
{
moduleExist = false;
foreach (System.Xml.XmlNode localNode in localNode0)
{
//找到对应模块
if (localNode.ChildNodes[0].InnerText == serverNode.ChildNodes[0].InnerText)
{
moduleExist = true;
//版本号判断
if (localNode.ChildNodes[1].InnerText.CompareTo(serverNode.ChildNodes[1].InnerText) < 0)
{
newVersionExist = true;
DownloadFile(serverNode.ChildNodes[2].InnerText, tempPath + serverNode.ChildNodes[0].InnerText);
}
break;
}
}
//没找到对应模块
if (false == moduleExist)
{
DownloadFile(serverNode.ChildNodes[2].InnerText, tempPath + serverNode.ChildNodes[0].InnerText);
newVersionExist = true;
}
}
//写入新UpdateConfig.xml升级完毕后替换
if (newVersionExist)
{
serverXmlDoc.Save(tempPath + "UpdateConfig.xml");
if (DialogResult.Yes == MessageBox.Show("有新版本,升级否", "提示", MessageBoxButtons.YesNo))
{
string[] dirs = System.IO.Directory.GetFiles(tempPath, "*.*");
string fileName;
foreach (string dir in dirs)
{
fileName = ((dir.Split(Convert.ToChar(@"/")))[dir.Split(Convert.ToChar(@"/")).Length - 1]);
if (System.IO.File.Exists(desPath + fileName))
{
//TODO:可以支持备份以前版本
System.IO.File.Delete(desPath + fileName);
}
//TODO:如果系统正在运行,您得停止系统,至于如何停止,也许可以使用System.Diagnostics.Process
System.IO.File.Move(dir, desPath + fileName);
}
MessageBox.Show("升级完毕");
}
else
{
//TODO:可以支持重新提示升级
}
}
}
catch (Exception ex)
{
throw new Exception("升级失败,原因是:" + ex.Message, ex);
}
}
2.3 运新更新
string path = Application.StartupPath;
this.VersionCheck(path, "http://localhost:4011/AppUpdate/WebService.asmx");