肖高辉's blog

up everyday,just a little.

[原创]C/S模式开发中利用WebClient自动升级

第一次在cnblogs发文章,没的什么经验,说的不好请大家见谅.

之前开发一套应用系统,采用了C/S模式,对客户端的应用程序自动升级提出了一些要求。
我便利用WebClient做了一下这个自动升级系统,在应用中还算不错。今日特地贡献出来,希望给大家一些借鉴。
系统分为3个部分:
1.Update.dll:供主应用程序调用的检测升级模块。
2.Update.exe:升级的主程序.
3.升级文件的服务器端配置文件和更新文件.需要WEB服务器支持。


第一部分:服务器存放的配置文件。
假设配置文件放在一个web服务器的某个目录下面。如:http://192.168.0.1/UpdateFiles
目录结构如下:
update.exe
update.xml
update/目录存放需要更新的文件列表

update.xml文件为升级调用的配置文件,如下:
<?xml version="1.0" encoding="utf-8" ?>
<Product>
  <Version>1.6.2.1</Version>
  <Description>2007.4.28升级版本</Description>
  <FileList>
    <Item Name="mis.exe" FileURL="http://192.168.0.1/UpdateFiles/Updatetmis.exe" Folder="" />
    <Item Name="config.ini" FileURL="http://192.168.0.1/UpdateFiles/Update/config.ini" Folder="" />   
    <Item Name="update.dll" FileURL="http://192.168.0.1/UpdateFiles/Update/update.dll" Folder="" />        
  </FileList>
</Product>
配置文件主要提供了当前服务器存放的系统版本号,已经相关的文件列表。相信大家都明白什么意思,不多说了。

第二部分:检测升级Update.dll
升级模块为了方便程序调用,单独封装在一个dll中,主程序只需要直接引用调用即可。代码如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

using System.IO;
using System.Net;
using System.Xml;
/*
 系统升级类
 */
namespace Update
{
    public class AutoUpdate
    {
        private WebClient client;
        private XmlDocument doc;
        public string Version = "";

        public void LoadUpdateXML()
        {
            //获取服务器信息
            client = new WebClient();           
            doc = new XmlDocument();
            try
            {
                doc.Load(client.OpenRead(@"http://192.168.0.1/UpdateFiles/Update.xml"));
                client = null;               
                //分析文件
                XmlNode node;
                node = doc.SelectSingleNode("Product/Version");
                if (node != null)
                {
                    Version = node.InnerText.Trim();
                }
            }
            catch
            {
                MessageBox.Show("无法取得更新文件!");
               
            }
        }

        /// <summary>
        /// 判断是否需要升级
        /// </summary>
        /// <returns></returns>
        public bool NeedUpdate()
        {
            LoadUpdateXML();
            //MessageBox.Show(Version + "||" + Application.ProductVersion);
            if (Version.Trim().CompareTo(Application.ProductVersion.Trim()) > 0)
                return true;
            return false;
        }
        /// <summary>
        /// 开始升级,
        /// </summary>
        public void Update()
        {
            if (NeedUpdate())
            {
                MessageBox.Show("已经有更新的程序,点击确定马上启动升级程序。");
                //下载服务器最新的升级程序,并且运行,退出本程序
                client = new WebClient();
                client.DownloadFile(@"http://192.168.0.1/UpdateFiles/update.exe", Application.StartupPath + "\\update.exe");
                System.Diagnostics.Process.Start(Application.StartupPath + "\\update.exe");               
                Application.ExitThread();
                Application.Exit();
            }
        }
    }
}

第三部分:更新程序update.exe
程序加载的时候从服务器读取文件列表,并且下载到本地执行目录,完成升级后自动启动主程序。
下载文件使用DownloadFile类,如下:
DownloadFile df = new DownloadFile();
// 文件的服务器地址
df.DownloadUrl = serverFile;
//下载本地的路径
df.DownloadFileName = localFile;
df.Download();

具体如何设计界面,因人而异,只是给出一个提示,请读者自己去完成。

主应用程序的调用Update.dll后如何检测呢?
Update.AutoUpdate up=new  Update.AutoUpdate();
if(up.NeedUpdate())
{
up.Update();

}

暂时就写到这里,有需要帮助的朋友请加我qq:38041762 或者email:gofixiao#126.com(请将#换成@)
补上demo:
/Files/gofixiao/Update_demo.rar

posted on 2007-06-14 08:59 肖高辉(MSCD) 阅读(4470) 评论(24)  编辑 收藏 网摘 所属分类: .Net Related

评论

#1楼 2007-06-14 09:05 MadGoat      

恩,不错。我也这样想过,但还要建一个web服务器。
我甚至有想法,直接把程序储存在sql数据库中,还未尝试,不知道可行性怎样。
  回复  引用  查看    

#2楼 2007-06-14 09:05 大豆男生      

为什么不用 ClickOnce?   回复  引用  查看    

#3楼[楼主] 2007-06-14 09:08 GOFI XIAO      

@大豆男生
ClickOnce我也试过,可能是我经验不够,发现在实施起来还是不如自己架设升级服务器,自己写升级代码来的舒服.
  回复  引用  查看    

#4楼[楼主] 2007-06-14 09:20 GOFI XIAO      

@MadGoat
你这种想法完全可行,当初我也是想需要一个单独的web服务器来实现,麻烦.
我以前也实施过将所有的文件以二进制流写入数据库中.但是这样还需要提供一个对文件的维护界面.
想想也算了.现在在.net下开发,一般可以将升级web服务器建立在数据库服务器上,无非就是安装一下iis而已.也算是方便,而且更加直观.
  回复  引用  查看    

#5楼 2007-06-14 09:25 superstar      

能否把这所有代码打包提供下载   回复  引用  查看    

#6楼[楼主] 2007-06-14 09:27 GOFI XIAO      

@superstar
稍后我做个demo上传一下.呵呵,最近忙.
  回复  引用  查看    

#7楼 2007-06-14 09:36 Zhongkeruanjian      

呵呵,ClickOne还是比较方便的,只是最开始用的时候需要注意一些地方就OK
  回复  引用  查看    

#8楼 2007-06-14 09:38 xiao_p      

enterprise library updater 就可以做到这个了,你可以参考参考,codeplex上有关于2.0的更新   回复  引用  查看    

#9楼 2007-06-14 10:01 巫云      

学习啦,好办法,准备用到我的项目中。   回复  引用  查看    

#10楼 2007-06-14 10:06 finesite

很早以前用过codeproject.com 上面的 smartclient update 感觉不错 可以参考以下!   回复  引用    

#11楼 2007-06-14 10:17 布鲁斯南      

可以把文件存到数据库中   回复  引用  查看    

#12楼 2007-06-14 10:19 xiaoyu7311[未注册用户]

支持原创,探讨一下:

C/S的升级,需要去做一个WEB的东西,有这个必要吗?

客户端的升级做了,但怎么发布需要升级的程序呢?这个好象还没有哟!
  回复  引用    

#13楼 2007-06-14 10:29 sunriseyuen[未注册用户]

还没有我写的那么好,
自动比较服务器跟当前版本的差异,把差异部分打包,然后下载下来!
  回复  引用    

#14楼[楼主] 2007-06-14 10:48 GOFI XIAO      

由于每个人设计的系统对应的客户不同,那么相应的升级系统的设计也是不同的.
由于我开发的系统是对用户定制的系统,对升级系统的实施不需要考虑安装程序,
所有可能不能完全适应大家的需要,这里只是提供一个设计思想供大家参考.希望对大家有所帮助.
  回复  引用  查看    

#15楼 2007-06-14 11:38 xiao_p      

enterprise 里有个block 叫 updater block 已经完成楼主所做的工作了,看来这个block 用过的人比较少,我在推荐一下吧, 只是到1.0版本就不更新了。

在codeplex上面有关于2.0的更新,需要升级部署的可以去看看!!!
  回复  引用  查看    

#16楼 2007-06-14 14:55 798彩信网[未注册用户]

798彩信网现在已开通了福彩3D预测,排列3预测,双色球3预测,排列3字谜,福彩3D字谜等栏目,本网站资料全部免费提供.   回复  引用    

#17楼 2007-06-14 14:56 798彩信网[未注册用户]

798彩信网http:www.cp798.cn现在已开通了福彩3D预测,排列3预测,双色球3预测,排列3字谜,福彩3D字谜等栏目,本网站资料全部免费提供.   回复  引用    

#18楼 2007-06-14 21:03 YAO.NET℡      

不错.
  回复  引用  查看    

#19楼 2007-06-15 10:04 teana[未注册用户]

纯顶。。   回复  引用    

#20楼 2007-06-17 00:31 se[未注册用户]

good.........   回复  引用    

#21楼 2007-06-27 15:38 feifox111[未注册用户]

clickonce好是好,可有一点麻烦,就是当我发布后,客户端只更新我发布的这台服务器里的东东,有没有办法移植到另外的服务器上去?不知道大家有什么办法。   回复  引用    

#22楼 2007-07-11 14:02 大豆男生      

@feifox111
肯定可以“移植到另外的服务器上”的:
“发布位置”下面的“安装URL”处输入真正的发布位置(例如:http://192.168.1.8/abc/)即可。
  回复  引用  查看    

#23楼 2007-07-19 14:30 阿Q[未注册用户]

请问:
ClickOne 发布能不能更新 安装目录?
  回复  引用    

#24楼 2007-11-07 09:08 独自等待[未注册用户]

@大豆男生
这样是可以,可是需要在发布前配置,发布C/S程序时已经锁定,可不可以修改为可配置呢?
  回复  引用    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 782972




相关文章:

相关链接: