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

news2024/11/26 12:23:05

服务器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 没有

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1849086.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

宇宙星空星辰美景素材哪里找?高清无水印分享

宇宙星空的美丽总能激发人们的无限遐想和灵感&#xff0c;不仅在科学教育领域&#xff0c;更在电影制作和视觉艺术中占有一席之地。为了帮助您找到高质量的宇宙星空视频素材&#xff0c;以下平台将成为您获取令人难忘天体视频素材的首选。 蛙学府 蛙学府作为新媒体创作者的宝库…

如何将图片转换为表格?方法并不难!

如何将图片转换为表格&#xff1f;在数字化时代&#xff0c;图片中的表格信息提取和整理成为了我们日常工作中不可或缺的一部分。不论是学术研究、商业分析还是个人生活&#xff0c;快速、准确地将图片转换为表格都显得尤为重要。今天&#xff0c;我们就来介绍四款强大的图片转…

经验总结--开关MOS管发热的一般原因/电源开发经验总结

开关MOS管发热的一般原因 做电源设计,或者做驱动方面的电路,难免要用到场效应管,也就是人们常说的MOS管。MOS管有很多种类,也有很多作用。做电源或者驱动的使用,当然就是用它的开关作用。 无论N型或者P型MOS管,其工作原理本质是一样的。MOS管是由加在输入端栅极的电压来控…

Android蓝牙开发(二)之蓝牙配对和蓝牙连接

BluetoothDevice.class.getMethod 进行配对&#xff0c;代码如下&#xff1a; Method method BluetoothDevice.class.getMethod(“createBond”); Log.e(getPackageName(), “开始配对”); method.invoke(listdevice.get(position)); invoke传的参数就是要配对的设备&…

ffmpeg音视频开发从入门到精通——ffmpeg日志及目录操作

文章目录 FFMPEG1. 操作日志2. 文件移动和删除3. 操作目录重要函数 FFMPEG 1. 操作日志 日志级别 AV LOG ERROR AV LOG WARNING AV LOG INFO AV LOG DEBUG cmake_minimum_required(VERSION 3.27) project(FFmpeg_exercise) set(CMAKE_CXX_STANDARD 14)# 定义FFmpeg的安装路…

Android自定义View之不得不知道的文件attrs

其中demo_style如下:一般都是放的.9图片&#xff0c;为了方便就放个颜色了 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190820183209784.png?x-oss-processimage/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLm NzZG4ubmV0L3FxXzQyNzYxMz…

海外云手机自动化管理,高效省力解决方案

不论是企业还是个人&#xff0c;对于海外社媒的营销都是需要自动化管理的&#xff0c;因为自动化管理不仅省时省力&#xff0c;而且还节约成本&#xff1b; 海外云手机的自动化管理意味着什么&#xff1f;那就是企业无需再投入大量的人力和时间去逐一操作和监控每一台设备。 通…

鞋子分类数据集17399张69类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;17399 分类类别数&#xff1a;69 类别名称:[“0”,“1”,“2”,“3”,“4”…

全国实体商铺店铺商家采集工具,一键采集商家手机号,让你轻松找到目标客户

随着互联网的发展&#xff0c;越来越多的商家开始在网上开展业务&#xff0c;实体商铺的竞争也日益激烈。为了更好地吸引客户&#xff0c;很多商家都选择了线上推广和营销。然而&#xff0c;仅仅依靠线上推广是远远不够的&#xff0c;线下的实体商铺也需要积极拓展客源。因此&a…

DBeaver 数据结果集设置不显示逗号(太丑了)

从Navicat切换过来使用DBeaver&#xff0c;发现类似bigint 这种数据类型在结果集窗口中显示总是给我加上一个逗号&#xff0c;看着很不习惯&#xff0c;也比较占空间&#xff0c;个人觉得这种可读性也不好。 于是我在网上尝试搜索设置方法&#xff0c;可能我的关键词没命中&…

数据更新-插入元组(VALUES)、修改属性(SET)、删除元组(DELETE)

一、插入元组 1、插入单个元组&#xff08;使用的是VALUES子句&#xff09; &#xff08;1&#xff09;语句格式 INSERT INTO <表名> 【&#xff08;<属性名1【&#xff0c;<属性名2>&#xff0c;...】&#xff09;】 VALUES &#xff08;<常量1>【&a…

CATO原理中的数学与魔术(十四)——流程设计思路与升华

早点关注我&#xff0c;精彩不错过&#xff01; 系列终于进入尾声&#xff01;前面13篇文章已经穷尽搜刮掉我目力所及的全部CATO魔术的相关内容&#xff0c;并重新建立理论&#xff0c;分门别类进行了介绍。详情请戳&#xff1a; CATO原理中的数学与魔术&#xff08;十三&#…

aardio - 日历

写了个日历小例程&#xff0c;因 lunar 农历库存在问题&#xff0c;经过研究算是变相解决了&#xff0c;日历也完成了雏形&#xff0c;先开源出来&#xff0c;感兴趣的玩玩。 请下载最新paint库、customPlus库、lunar库。 不同的颜色搭配&#xff0c;实现不同的风格&#xff1…

小区业主管理系统

摘 要 随着城市化进程的加速和人口的不断增加&#xff0c;小区的数量也在不断增加。小区作为城市居民居住的主要场所&#xff0c;其管理工作也变得越来越重要。传统的小区业主管理方式存在诸多问题&#xff0c;如信息传递不畅、业务处理效率低下等。因此&#xff0c;开发一个高…

循环赛日程表

描述 n 2 ^ k个选手 每个选手必须与其他n-1个选手各赛一次每个选手一天赛一次比赛打n-1天 思路 k 3时的解 我们先进行假设&#xff1a;每个选手第一天和自己比&#xff0c;然后分解成4个子问题&#xff1a; (1)14号的第14天&#xff0c;对手1~4号; (2)14号的第58天&a…

数据结构——优先级队列(堆)Priority Queue详解

1. 优先级队列 队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优先级&#xff0c;一般出队列时&#xff0c;可能需要优先级高的元素先出队列&#xff0c;该场景下&#xff0c;使用队列不合适 在这种情况下&#xff0c;数据结构应…

python-爬虫篇-爬取百度贴吧,段友之家的图片和视频

#!/usr/bin/env python # -*- coding: utf-8 -*-""" 爬取百度贴吧&#xff0c;段友之家的图片和视频 author: cuizy time&#xff1a;2018-05-19 """import requests import bs4 import osdef write_file(file_url, file_type):""&quo…

高可用设备日志采集工具

免费试用下载: Gitee下载 最新版本 优势: A. 开箱即用. 解压直接运行.不需额外安装. B. 批管理设备. 设备配置均在后台管理. C. 无人值守 客户端自启动,自更新. D. 稳定安全. 架构简单,内存占用小,通过授权访问.

Java——包

一、包 1、简要介绍 在Java编程语言中&#xff0c;包&#xff08;Package&#xff09; 是一种用来组织和管理类&#xff08;Class&#xff09;和接口&#xff08;Interface&#xff09;的机制。包为开发者提供了一种逻辑分组的方式&#xff0c;使代码更加模块化、结构化和易于…

获取泛型,泛型擦除,TypeReference 原理分析

说明 author blog.jellyfishmix.com / JellyfishMIX - githubLICENSE GPL-2.0 获取泛型&#xff0c;泛型擦除 下图中示例代码是一个工具类用于生成 csv 文件&#xff0c;需要拿到数据的类型&#xff0c;使用反射感知数据类型的字段&#xff0c;来填充表字段名。可以看到泛型…