商业WEB产品的asp.net core3热更新如何实现??

李炳君 2020-02-29 09:07:57
有一个web产品是部署到客户的服务器上,这样的客户有几十上百个, 以前是用.net4x开发的,通过自身的功能可以从升级服务器中下载zip文件,然后自解压自覆盖(其中有sql的执行、css 、js、dll这些文件)。 我们做了个批量远程升级的功能,只需要点一下鼠标就能向几十个客户的系统发送指令,这些客户端会自动执行整个升级过程是(这个升级也是web产品内的功能,并不是一个windows服务或其它应有程序)。

现在的问题是.net core3.1(目前正在学习),再用这种方式就不能覆盖dll啊,提示文件被另一程序打开,搜索了各种方案都必须要停止+手动操作,这对于我们完全是无法接受的,不可能手动去更新几十个客户的服务器,而且一天要更新多次,那不得疯!!!

求各位,或大家谈谈你们的看法

目前感觉asp.net core还很不完善,更像一个预览版本,开发起来很麻烦,而且关于更新这个是商品项目最看中的,这个解决不了,根本无法技术选型。
...全文
950 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
开源:AspNetCore 应用程序热更新升级工具(全网第一份公开的解决方案)https://www.cnblogs.com/cyq1162/p/14280939.html
aks393482077 2020-03-05
  • 打赏
  • 举报
回复
dll加上版本号就可以了啊
luj_1768 2020-03-03
  • 打赏
  • 举报
回复
老哥的代码质量不错,多数是被系统征用了。所以,如果能够并入windows 升级发布服务系统,就可以使用windows的服务资源,稳定性和可靠性都能提高许多。
Jlion8 2020-03-02
  • 打赏
  • 举报
回复
引用 10 楼 Delete 的回复:
既然是部署在客服的服务器上,那就可以在客户的服务器上开启一个自动更新的window服务,通过这个服务去执行升级,一收到升级指令就把web产品停止,并升级相关的dll再启动产品
这是一种方法,不过额外的是需要开发window服务,并且维护它
Jlion8 2020-03-02
  • 打赏
  • 举报
回复
既然是部署在客服的服务器上,那就可以在客户的服务器上开启一个自动更新的window服务,通过这个服务去执行升级,一收到升级指令就把web产品停止,并升级相关的dll再启动产品
weixin_43744383 2020-03-02
  • 打赏
  • 举报
回复
收下了谢谢收下了谢谢
李炳君 2020-03-02
  • 打赏
  • 举报
回复
引用 9 楼 楠小南 的回复:
[quote=引用 8 楼 李炳君 的回复:] [quote=引用 6 楼 楠小南 的回复:] [quote=引用 4 楼 李炳君 的回复:] [quote=引用 1 楼 贵阳老马马善福专业维修游泳池堵漏防水工程 的回复:] 将原来的dll改名,按照我的理解,文件改名、移动(同一个盘)是可以的
我试了一下手动可以改名,用程序还没试过。 但然并卵, 就算dll改成另一个名字,按F5网页还是能照样显示(按以前的.net肯定是要黄屏的) 也就是说把新dll考进去,也得重新启动iis或等服务器自动重新才能更新,同样达不到要求。[/quote] 先改名,然后复制新的dll,替换,但是旧的会被锁定?那你要用 IHostApplicationLifetime 服务将进程杀死,那么旧的就可以删除了,下次有人访问网站就是最新的了[/quote] 按现在的做法是(改名->拷贝新的dll->杀进程或结束服务->等用户下次http请求系统会自动重启) 如何杀进程求code,小弟初学core,不是太懂。[/quote]


 [HttpPost]
        public IActionResult Cunn([FromServices]IHostApplicationLifetime application)
        {
            //获取程序的工作目录路径,依赖注入 IWebHostEnvironment
            var web = WebHost.ContentRootPath;

            //// 改名方法-假设项目的dll 为 WebApplication1.dll
            FileInfo fi = new FileInfo(Path.Combine(web, "WebApplication1.dll"));
            //// 改为 a1234
            fi.MoveTo(Path.Combine(web, "a1234.dll"));

            //要复制的新文件路径-你的新dll 路径 可以是下载或者复制或移动
            string pLocalFilePath = Path.Combine(WebHost.WebRootPath, "css", "WebApplication1.dll");

            //将新文件复制过去基目录
            string pSaveFilePath = Path.Combine(web, "WebApplication1.dll");
            if (System.IO.File.Exists(pLocalFilePath))
            {
                System.IO.File.Copy(pLocalFilePath, pSaveFilePath, true);

                //复制成功后, 杀死当前的进程=相当于重启了  依赖注入 IHostApplicationLifetime
                application.StopApplication();
            }

            return Content("ok");
        }

[/quote] 很牛B啊,测试有效,感谢! 不过有个小插曲 WebHost.ContentRootPath 没有 ContentRootPath这个方法,不知道为什么,我改用的是Directory.GetCurrentDirectory()。 我用的是core 3.1 ,难道这个方法取消了?
threenewbee 2020-03-01
  • 打赏
  • 举报
回复
引用 4 楼 李炳君 的回复:
[quote=引用 1 楼 贵阳老马马善福专业维修游泳池堵漏防水工程 的回复:]
将原来的dll改名,按照我的理解,文件改名、移动(同一个盘)是可以的


我试了一下手动可以改名,用程序还没试过。
但然并卵, 就算dll改成另一个名字,按F5网页还是能照样显示(按以前的.net肯定是要黄屏的)
也就是说把新dll考进去,也得重新启动iis或等服务器自动重新才能更新,同样达不到要求。[/quote]

你程序通过 Assembly.LoadFrom 可以加载新的
李炳君 2020-03-01
  • 打赏
  • 举报
回复
引用 1 楼 贵阳老马马善福专业维修游泳池堵漏防水工程 的回复:
将原来的dll改名,按照我的理解,文件改名、移动(同一个盘)是可以的
我试了一下手动可以改名,用程序还没试过。 但然并卵, 就算dll改成另一个名字,按F5网页还是能照样显示(按以前的.net肯定是要黄屏的) 也就是说把新dll考进去,也得重新启动iis或等服务器自动重新才能更新,同样达不到要求。
李炳君 2020-03-01
  • 打赏
  • 举报
回复
引用 2 楼 楠小南 的回复:
那就用回4x 吧, 就算给你替换成功了,那么在linux里面呢?要是别人部署在docker呢?你怎么升级,总不能限制别人怎么部署吧
我们的产品是我们公司安装部署,都是用的windows系统,客户不可能自已部署,所以不考虑其它环境。
楠小南 2020-03-01
  • 打赏
  • 举报
回复
引用 8 楼 李炳君 的回复:
[quote=引用 6 楼 楠小南 的回复:]
[quote=引用 4 楼 李炳君 的回复:]
[quote=引用 1 楼 贵阳老马马善福专业维修游泳池堵漏防水工程 的回复:]
将原来的dll改名,按照我的理解,文件改名、移动(同一个盘)是可以的


我试了一下手动可以改名,用程序还没试过。
但然并卵, 就算dll改成另一个名字,按F5网页还是能照样显示(按以前的.net肯定是要黄屏的)
也就是说把新dll考进去,也得重新启动iis或等服务器自动重新才能更新,同样达不到要求。[/quote]

先改名,然后复制新的dll,替换,但是旧的会被锁定?那你要用 IHostApplicationLifetime 服务将进程杀死,那么旧的就可以删除了,下次有人访问网站就是最新的了[/quote]



按现在的做法是(改名->拷贝新的dll->杀进程或结束服务->等用户下次http请求系统会自动重启)

如何杀进程求code,小弟初学core,不是太懂。[/quote]





[HttpPost]
public IActionResult Cunn([FromServices]IHostApplicationLifetime application)
{
//获取程序的工作目录路径,依赖注入 IWebHostEnvironment
var web = WebHost.ContentRootPath;

//// 改名方法-假设项目的dll 为 WebApplication1.dll
FileInfo fi = new FileInfo(Path.Combine(web, "WebApplication1.dll"));
//// 改为 a1234
fi.MoveTo(Path.Combine(web, "a1234.dll"));

//要复制的新文件路径-你的新dll 路径 可以是下载或者复制或移动
string pLocalFilePath = Path.Combine(WebHost.WebRootPath, "css", "WebApplication1.dll");

//将新文件复制过去基目录
string pSaveFilePath = Path.Combine(web, "WebApplication1.dll");
if (System.IO.File.Exists(pLocalFilePath))
{
System.IO.File.Copy(pLocalFilePath, pSaveFilePath, true);

//复制成功后, 杀死当前的进程=相当于重启了 依赖注入 IHostApplicationLifetime
application.StopApplication();
}

return Content("ok");
}



李炳君 2020-03-01
  • 打赏
  • 举报
回复
引用 6 楼 楠小南 的回复:
[quote=引用 4 楼 李炳君 的回复:] [quote=引用 1 楼 贵阳老马马善福专业维修游泳池堵漏防水工程 的回复:] 将原来的dll改名,按照我的理解,文件改名、移动(同一个盘)是可以的
我试了一下手动可以改名,用程序还没试过。 但然并卵, 就算dll改成另一个名字,按F5网页还是能照样显示(按以前的.net肯定是要黄屏的) 也就是说把新dll考进去,也得重新启动iis或等服务器自动重新才能更新,同样达不到要求。[/quote] 先改名,然后复制新的dll,替换,但是旧的会被锁定?那你要用 IHostApplicationLifetime 服务将进程杀死,那么旧的就可以删除了,下次有人访问网站就是最新的了[/quote] 按现在的做法是(改名->拷贝新的dll->杀进程或结束服务->等用户下次http请求系统会自动重启) 如何杀进程求code,小弟初学core,不是太懂。
李炳君 2020-03-01
  • 打赏
  • 举报
回复
引用 5 楼 贵阳老马马善福专业维修游泳池堵漏防水工程 的回复:
[quote=引用 4 楼 李炳君 的回复:] [quote=引用 1 楼 贵阳老马马善福专业维修游泳池堵漏防水工程 的回复:] 将原来的dll改名,按照我的理解,文件改名、移动(同一个盘)是可以的
我试了一下手动可以改名,用程序还没试过。 但然并卵, 就算dll改成另一个名字,按F5网页还是能照样显示(按以前的.net肯定是要黄屏的) 也就是说把新dll考进去,也得重新启动iis或等服务器自动重新才能更新,同样达不到要求。[/quote] 你程序通过 Assembly.LoadFrom 可以加载新的[/quote] 这个dll文件就是 asp.net core打包后的文件, 也就是自己的.cs文件,全站只有这么一个dll文件。 不可能自己加载自己的。
楠小南 2020-03-01
  • 打赏
  • 举报
回复
引用 4 楼 李炳君 的回复:
[quote=引用 1 楼 贵阳老马马善福专业维修游泳池堵漏防水工程 的回复:]
将原来的dll改名,按照我的理解,文件改名、移动(同一个盘)是可以的


我试了一下手动可以改名,用程序还没试过。
但然并卵, 就算dll改成另一个名字,按F5网页还是能照样显示(按以前的.net肯定是要黄屏的)
也就是说把新dll考进去,也得重新启动iis或等服务器自动重新才能更新,同样达不到要求。[/quote]

先改名,然后复制新的dll,替换,但是旧的会被锁定?那你要用 IHostApplicationLifetime 服务将进程杀死,那么旧的就可以删除了,下次有人访问网站就是最新的了
楠小南 2020-02-29
  • 打赏
  • 举报
回复
那就用回4x 吧, 就算给你替换成功了,那么在linux里面呢?要是别人部署在docker呢?你怎么升级,总不能限制别人怎么部署吧

threenewbee 2020-02-29
  • 打赏
  • 举报
回复
将原来的dll改名,按照我的理解,文件改名、移动(同一个盘)是可以的

62,067

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧