WPF 程序 分布式 自动更新 登录 打包

服务器server端 core api 

客户端WPF

 // 检查应用更新
   //1、获取最新文件列表
   // 
   var files = fileService.GetUpgradeFiles();
   // 2、文件判断,新增的直接下载;更新的直接下载;删除的直接删除
   //    客户端本地需要一个记录,最后更新的记录()

服务器端 api

orm  dal

客户端

1、更新文件对比
2、自动更新程序与逻辑梳理
3、进程间更新数据传输
4、更新数据接收与准备
5、更新程序UI处理
6、文件下载服务接口逻辑

1文件对比 客户端本地对比upgrade_temp.json文件

 // 开始下载文件    从服务器上下载相关文件

// 服务器拿到文件列表中的文件都得下载
if (update_file.Count > 0)
{
    // 启动更新程序,并且将更新文件列表传给它
    Process.Start("Zhaoxi.PMS.Client.Upgrade.exe", update_file);
    // 

    // 下载完成进行服务文件列表的保存(Json序列化)
    // 这个逻辑需要在Upgrade.exe进程里处理,判断正常更新完成后写入
    //json_str = System.Text.Json.JsonSerializer.Serialize(update_file);
    //File.WriteAllText("upgrade_temp.json", json_str);

    //Application.Current.Shutdown();
    System.Environment.Exit(0);// 结束进程
}

启动线程 调试 更新程序 进程间更新数据传递

细节  文字省略

进度 
                            <TextBlock Text="{Binding FileName}" VerticalAlignment="Bottom"
                                       Grid.Column="1" Grid.ColumnSpan="2" Margin="10,0" FontWeight="Bold"
                                       TextTrimming="WordEllipsis"/>

                            <TextBlock Text="{Binding FileLenght}" VerticalAlignment="Top" Grid.Row="1" Grid.Column="1" 
                                       Margin="10,3" FontSize="11" Foreground="#888"/>
                            <TextBlock Text="{Binding CompletedLen}" VerticalAlignment="Top" Grid.Column="2" Margin="10,3"
                                       Grid.Row="1" FontSize="11" Foreground="#888"/>
                            <TextBlock Text="{Binding Progress,StringFormat={}{0:P0}}" 
                                       VerticalAlignment="Center" HorizontalAlignment="Center"
                                       Grid.Column="3" Grid.RowSpan="2"/>

正在更新

  <TextBlock Grid.Row="2" 
             Margin="30,0,0,0" VerticalAlignment="Center">
      <Run Text="正在更新...."/>
      <Run Text="["/><Run Text="{Binding Completed}"/><Run Text="/"/><Run Text="{Binding TotalCount}"/><Run Text="]"/>
  </TextBlock>
  <Button Content="开始更新" Grid.Row="2" Margin="0,0,30,0" 
          HorizontalAlignment="Right" VerticalAlignment="Center"
          Padding="10,5" BorderThickness="0"
          Background="Orange" Foreground="White"
          Command="{Binding StartCommand}"/>

download sever

注意:关键点 坑点! 下载的文件路径 

     // http://localhost:5000/api/file/download/modules/dll_name
     // http://localhost:5273/api/File/download/none/       Client.BLL.dll

   [HttpGet("download/{p}/{file}")]
   public ActionResult Download([FromRoute(Name = "p")] string path, [FromRoute] string file)
   {
       //if (!System.IO.File.Exists(path))
       //    return NotFound("123123123");

       // 服务器中存放更新文件的根目录
       var root = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
       string filePath = Path.Combine(root, "WebFiles", "UpgradeFiles");
       // 如果有子目录,则拼进来
       if (path != "none")
           filePath = Path.Combine(filePath, path);
       // 最终文件路径
       filePath = Path.Combine(filePath, file);

       ResFileStream fs = new ResFileStream(filePath, FileMode.Open, FileAccess.Read);
       var type = new MediaTypeHeaderValue("application/oct-stream").MediaType;

       // 最终返回文件对象
       return File(fs, type, fileDownloadName: file);
   }


    internal class ResFileStream : FileStream
    {
        public ResFileStream(string path, FileMode mode, FileAccess access) : base(path, mode, access) { }

        /// <param name="array"></param>
        /// <param name="offset">偏移量</param>
        /// <param name="count">读取的最大字节数</param>
        /// <returns></returns>
        public override int Read(byte[] array, int offset, int count)
        {
            // 此处可以限制下载速度
            //count = 256;
            //Thread.Sleep(10);
            return base.Read(array, offset, count);
        }
    }

取巧调试 这里坑比较大 哈 备注下

Zhaoxi.PMS.Client.BLL.dll|UpgradeFiles|100
Zhaoxi.PMS.Client.IBLL.dll|UpgradeFiles|110
Zhaoxi.PMS.Client.IDAL.dll|UpgradeFiles|120
 

Zhaoxi.PMS.Client.BLL.dll|Modules|100
Zhaoxi.PMS.Client.IBLL.dll||110
Zhaoxi.PMS.Client.IDAL.dll||120

取巧部分不知道能否上生产环境哈 待验证 目测应该不能

--分割 演示

vip.xspf|.\|4577|101c3def4146d1e7f018583bd7aa5483
箭头.png|.\|1823|8d15c94446a411344c0535898663bdf2
宣讲PPT.txt|.\|1249|f747c130458731baf49b28a3a4d5b587

验证

请求下载

downloadFile 去下载

服务器端

客户端

文件读写权限修改 也不行 ?

--

疑问 这两个程序相互打开关系 杀毒软件不打架?

c端

c端更新程序

测试了下只是开发环境的主流程部分跑起来了。。离生产环境使用 还有诸多细节处理。

%AppData%

wpf 分布式登录 server api

带token jwt

C端 

setup 没有

先潦草的写下后面真能跑起来在来改吧    

先这样吧 。。。坑对新手不是很友好。。。目测跑个测试环境都费劲。。。

  • 14
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
WPF程序自动更新是指在WPF应用程序运行过程中,可以自动检测和下载最新的程序版本,并完成程序的升级更新。实现WPF程序自动更新有很多方式,一种常见的方式是使用ClickOnce部署技术。 ClickOnce是微软提供的一种应用程序部署技术,它能够实现WPF程序自动更新。具体实现步骤如下: 1. 在Visual Studio中,将WPF项目配置为发布状态。点击项目解决方案资源管理器中的项目名称,选择“属性”菜单,进入属性窗口。在窗口中选择“发布”选项卡,进行配置。 2. 在“发布”选项卡中,进行目标位置的配置,设置应用程序安装地址、发布文件夹路径等信息。 3. 在“发布”选项卡的“更新”部分,选择“发现更新方式”。可以选择自动发现更新或手动发现更新。 4. 配置完成后,点击“发布”按钮,将发布文件发布到指定位置。 5. 在应用程序启动时,调用ClickOnce提供的API,检查是否有可用的更新包。如果有更新包,就提示用户下载并安装新版本。 通过以上步骤,就可以实现WPF程序自动更新了。当用户打开应用程序时,应用程序自动检测是否有新的发布版本,如果有,就会弹出对话框提示用户进行更新。用户点击更新按钮后,应用程序自动下载并安装新版本。 WPF程序自动更新能够保证用户使用的总是最新的程序版本,提升了用户体验,同时也方便开发者进行 bug 修复和功能更新
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云草桑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值