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 没有

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CentOS7在2024.6.30停止维护后,可替代的Linux操作系统

背景 Linux的发行版本可以大体分为两类&#xff0c;一类是商业公司维护的发行版本&#xff0c;一类是社区组织维护的发行版本&#xff0c;前者以著名的Redhat&#xff08;RHEL&#xff09;为代表&#xff0c;后者以Debian为代表。国内占有率最多的却是Centos&#xff0c;这是由…

C++设计模式——Composite组合模式

一&#xff0c;组合模式简介 真实世界中&#xff0c;像企业组织、文档、图形软件界面等案例&#xff0c;它们在结构上都是分层次的。将系统分层次的方式使得统一管理和添加不同子模块变得容易&#xff0c;在软件开发中&#xff0c;组合模式的设计思想和它们类似。 组合模式是…

Navicat和SQLynx产品功能比较二(SQL查询)

数据库管理工具最常用的功能就是SQL的查询&#xff0c;没有之一。本文针对Navicat和SQLynx做了SQL查询相关的性能测试&#xff0c;从测试结果来看&#xff0c;Navicat主要适合开发类的小型数据量需求&#xff0c;SQLynx可以适应大型数据量或小型数据量的需求&#xff0c;用户可…

自制HTML5游戏《开心消消乐》

1. 引言 游戏介绍 《开心消消乐》是一款基于HTML5技术开发的网页游戏&#xff0c;以其简单的操作方式、轻松的游戏体验和高度的互动性&#xff0c;迅速在社交平台上获得了广泛的关注和传播。玩家通过消除相同类型的元素来获得分数&#xff0c;游戏设计巧妙&#xff0c;易于上手…

Ubuntu系统使用快速入门实践(八)—— git 命令使用

Ubuntu系统使用快速入门实践系列文章 下面是Ubuntu系统使用系列文章的总链接&#xff0c;本人发表这个系列的文章链接均收录于此 Ubuntu系统使用快速入门实践系列文章总链接 下面是专栏地址&#xff1a; Ubuntu系统使用快速入门实践系列文章专栏 文章目录 Ubuntu系统使用快速…

锂锗磷硫(LGPS)是代表性硫化物固态电解质产品之一 技术研究不断深入

锂锗磷硫&#xff08;LGPS&#xff09;是代表性硫化物固态电解质产品之一 技术研究不断深入 锂锗磷硫&#xff0c;化学式为Li10GeP2S12&#xff0c;英文简称LGPS&#xff0c;是一种代表性硫化物固态电解质&#xff0c;外观为灰白色至深灰色固体粉末状。 全固态锂电池是传统液态…

网上的流量卡真的可以免费领取吗?

网上的流量卡真的可以免费领取吗&#xff1f;当然可以&#xff0c;目前运营商推出的流量卡都是可以免费领取的。 有很多朋友私信给小编&#xff0c;听说流量卡是免费领取的就觉得不太靠谱&#xff0c;其实这种想法是不对的&#xff0c;首先大家要换位思考一下&#xff0c;如果我…

[JS]数据类型

介绍 在计算中一切事物都是数据, 为了提高数据的存储和使用效率, 要对数据进行类型的分类 栈(操作系统): 由操作系统自动分配释放函数的参数值, 局部变量的值等, 其操作方式类似于数据结构中的栈; 基本数据类型存放在栈里面string, number, boolean, undefined, null 堆(操作…

设计模式1-简介

设计模式简介 专栏的目的什么是设计模式设计模式要学什么软件开发原则主流设计模式 学习建议经典面试题 资源 专栏的目的 1.理解松耦合的设计思想 2.掌握面向对象设计原则 3.掌握重构技法改善设计 4.掌握GOF核心设计模式 什么是设计模式 每一个模式描述了一个在我们周围不…

docker 环境部署

1.Redis部署 用docker拉取redis镜像 docker pull redis 用docker查看拉取的镜像版本号&#xff0c;这里查到的是 6.2.6 版本 docker inspect redis 通过wget指令下载对应版本的tar包&#xff0c;下载完成后解压 wget https://download.redis.io/releases/redis-6.2.6.tar.gz …

【2024.6.22】今日科技时事:科技前沿大事件

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

Python抓取高考网图片

Python抓取高考网图片 一、项目介绍二、完整代码一、项目介绍 本次采集的目标是高考网(http://www.gaokao.com/gkpic/)的图片,实现图片自动下载。高考网主页如下图: 爬取的流程包括寻找数据接口,发送请求,解析图片链接,向图片链接发送请求获取数据,最后保存数据。 二…

Android设置页面Activity全屏(隐藏导航栏、状态栏)

3、代码中设置&#xff1a;在setContentView 之前调用 requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 注意&#xff1a; 当有全面屏手机可以显示虚拟…

geojson文件默认已有的style会导致webGL渲染错误处理办法

geojson文件默认已有的style会导致webGL渲染错误处理办法 相关链接&#xff1a; 功能示例(Vue版) | Mars3D三维可视化平台 | 火星科技 代码&#xff1a; export function showDraw(isFlyTo) {removeLayer()graphicLayer new mars3d.layer.GeoJsonLayer({data: {type: &quo…

vue3-openlayers 轨迹回放(历史轨迹),实时轨迹

vue3-openlayers 轨迹回放&#xff08;历史轨迹&#xff09;&#xff0c;实时轨迹 本篇介绍一下使用vue3-openlayers轨迹回放&#xff08;历史轨迹&#xff09;&#xff0c;实时轨迹 1 需求 轨迹回放&#xff08;历史轨迹&#xff09;实时轨迹 2 分析 可以使用和上一篇相同…

【一步一步了解Java系列】:认识异常类

看到这句话的时候证明&#xff1a;此刻你我都在努力 加油陌生人 个人主页&#xff1a;Gu Gu Study专栏&#xff1a;一步一步了解Java 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 作者&#xff1a;小闭…

Python中用于从图像中提取文本的8大OCR库

介绍 你是否曾想过你的电脑如何能够从图像中读取文字&#xff1f;这都要归功于一种叫做光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;的技术。 在Python中&#xff0c;有一些非常酷的库可以帮助你的电脑理解图片中的文字。从谷歌强大的Tesseract到E…

热点观察 | 全球社交应用IAP收入持续上升,小游戏、短剧出海赛道火热!

2024年进度条即将过半&#xff0c;回顾上半年&#xff0c;“Sora横空出世”、“短剧出海”、“小游戏爆款不断"给了我们太多惊喜&#xff0c;虽说如今市场竞争激烈、行业日趋饱和&#xff0c;但新技术、新需求也在快速跟上。下面&#xff0c;我们就来盘一盘近期全球手游和…

Python | Leetcode Python题解之第166题分数到小数

题目&#xff1a; 题解&#xff1a; class Solution:def fractionToDecimal(self, numerator: int, denominator: int) -> str:if numerator % denominator 0:return str(numerator // denominator)s []if (numerator < 0) ! (denominator < 0):s.append(-)# 整数部…

开发指南033-数据库兼容

元芳&#xff0c;你怎么看&#xff1f; 单一数据库自身就有一些不同处理之处&#xff0c;如果一个平台要兼容所有数据库&#xff0c;就是难上加难&#xff0c;像isnull函数各数据库就不同。 对于这类问题&#xff0c;平台采用统一自定义函数解决&#xff0c;例如上面的round函…