ClickOnce DIY全自动更新下载升级的自我实现
ClickOnce DIY全自动更新下载升级的自我实现
发布时间:2016-12-29 来源:查字典编辑
摘要:SmartClient概念近来比较热,但在微软提出这个名词以前已经有大量的软件在这么做了,一方面是简化客户端的部署,一方面是提供自动升级的功...

SmartClient概念近来比较热,但在微软提出这个名词以前已经有大量的软件在这么做了,一方面是简化客户端的部署,一方面是提供自动升级的功能;对于传统的WinForm应用来讲,确实是可以降低维护成本的一个不错的解决方案;

微软在推出SmartClient概念时,推出了相关的updater的ApplicationBlock,做的也蛮不错,但作者前段还是根据软件特性自己写了一个很简单的实现,大家也大概能了解一下原理:

笔者的简化版自动升级管理器只需要四步走:

1.一个负责查找和下载新版本的本地类

2.本地配置文件中(或在代码中硬编码?不太好吧),指向更新服务器的URL

3.服务器上一个标识版本号和新文件URL的配置文件

4.调用示例

1.版本管理类

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

usingSystem.Xml;

usingSystem.Net;

usingSystem.IO;

usingSystem.Windows.Forms;

namespaceSurvey

{

classVersionAgent

{

publicstaticboolCheckNetwork()

{

HttpWebRequestrequest;

try

{

request=(HttpWebRequest)WebRequest.Create(Pub.GetSetting("UpdateUrl"));//从本地配置文件获取的网络中配置文件的URL

request.Proxy=WebProxy.GetDefaultProxy();

request.GetResponse();//如果可以获得响应,说明网络没问题

}

catch(Exceptione)

{

Pub.logError(e);

returnfalse;

}

returntrue;

}

publicstaticboolCheckUpdate()

{

XmlDocumentdoc=loadXMLDocument(Pub.GetSetting("UpdateUrl"));

Sys.UpdateUrl=GetValue(doc,"DownloadURL").Trim();//将来会用这个URL自动下载

Sys.UpdatePage=GetValue(doc,"DownloadPage").Trim();//如自动下载失败,会提供到这个页面手工下载

stringwarningRate=GetValue(doc,"WarningRate").Trim();

float.TryParse(warningRate,outSys.WarningRate);

stringNetVersion=GetValue(doc,"Version").Trim();

VersionLocalVersion=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;

returnnewVersion(NetVersion).CompareTo(newVersion(LocalVersion))>0;//大于0说明有新版本发布

}//这个方法是载入网络配置文件,读取一些不想放在本地的配置参数,以及比较本地和网络版本号

publicstaticboolGoUpdate()

{

returnDownLoadFile(Sys.UpdateFile,Sys.UpdateUrl);

}

publicstaticstringGetValue(XmlDocumentdoc,stringKey)

{

stringValue;

try

{

XmlElementelem=(XmlElement)doc.SelectSingleNode(@"/config/app/"+Key);//读取配置文件可自行定义

Value=elem==null?"":elem.GetAttribute("value");

}

catch

{

Value="";

}

returnValue;

}

publicstaticXmlDocumentloadXMLDocument(stringFileNameOrUrl)

{

XmlDocumentdoc=null;

try

{

doc=newXmlDocument();

doc.Load(FileNameOrUrl);

}

catch(Exceptione)

{

System.Windows.Forms.MessageBox.Show(e.Message);

Pub.logError(e);

doc=null;

}

returndoc;

}

publicstaticboolDownLoadFile(stringFileName,stringUrl)

{

boolValue=false;

WebResponseresponse=null;

Streamstream=null;

try

{

HttpWebRequestrequest=(HttpWebRequest)WebRequest.Create(Url);

response=request.GetResponse();

stream=response.GetResponseStream();

if(!response.ContentType.ToLower().StartsWith("text/"))

{

Value=SaveBinaryFile(response,FileName);

}

}

catch(Exceptione)

{

//System.Windows.Forms.MessageBox.Show(e.Message);

Pub.logError(e);

}

returnValue;

}

privatestaticboolSaveBinaryFile(WebResponseresponse,stringFileName)

{

boolValue=true;

byte[]buffer=newbyte[1024];

try

{

if(File.Exists(FileName))

File.Delete(FileName);

StreamoutStream=System.IO.File.Create(FileName);

StreaminStream=response.GetResponseStream();

intl;

do

{

l=inStream.Read(buffer,0,buffer.Length);

if(l>0)

outStream.Write(buffer,0,l);

}

while(l>0);

outStream.Close();

inStream.Close();

}

catch(Exceptione)

{

System.Windows.Forms.MessageBox.Show(e.Message);

Pub.logError(e);

Value=false;

}

returnValue;

}

}

}

2.本地配置文件可能如:

<configuration>

<appSettings>

<addkey="UpdateUrl"value="http://www.abc.com/download/release.xml"/>

</appSettings>

</configuration>

3.网络配置文件可能如:

<config>

<app>

<Versionvalue="1.1.9.2"/>

<ReleaseDatevalue="2006-12-12"/>

<DownloadPagevalue="http://www.abc.com/download/index.htm"/>

<DownloadURLvalue="http://www.abc.com/download/update.exe"/>

<WarningRatevalue="0.3"/>

</app>

</config>

4.调用示例

在认为合适的时机(比如说应用程序启动时),启动一个后台线程去工作:

Threadthread=newThread(newThreadStart(threadMethodUpdate));

thread.Start();

privatevoidthreadMethodUpdate()

{

if(VersionAgent.CheckNetwork())//网络状况正常

{

if(VersionAgent.CheckUpdate())//检查更新并获取网络参数

{

if(VersionAgent.GoUpdate())//获取新版本(由于我的软件很小,所以在不提示用户的情况就进行了新版下载,如认为不妥,可通过MessageBox提示一下)

{

MessageBox.Show("检测到产品的更新版本,即将开始自动更新!","版本升级",MessageBoxButtons.OK,MessageBoxIcon.Information);

System.Diagnostics.Process.Start(Sys.UpdateFile);

System.Environment.Exit(0);

}

else

{

MessageBox.Show("系统检测到更新版本,但自动下载失败,点击确定进行手动下载","版本升级",MessageBoxButtons.OK,MessageBoxIcon.Error);

System.Diagnostics.Process.Start(Sys.UpdatePage);

System.Environment.Exit(0);

}

}

}

else//也可以什么也不提示

MessageBox.Show("无法连接到服务器进行自动升级!n请检查网络连接"+Pub.GetSetting("UpdateUrl"),"网络异常",MessageBoxButtons.OK,MessageBoxIcon.Warning);

}

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新asp.net教程学习
热门asp.net教程学习
编程开发子分类