关于Core发布到IIS的热发布问题,或者覆盖dll文件的时候会报错"文件已在另外一个程序中打开",也就是没法覆盖程序的问题,通过百度和分析总结如下几种方案:css
1)在发布路径新建一个文件夹"UpdateFiles"web
2)文件夹"UpdateFiles"里面放一个app_offline.htm文件,这个文件是网站处于离线状态的时候的返回给客户端的页面内容服务器
3)文件夹"UpdateFiles"里面放一个"PublishFiles"文件夹,这个文件夹里面放须要发布的文件app
4)在发布路径下面新建一个"pubish.bat"文件,里面输入以下内容:其实就是先复制app_offline.htm文件到发布路径,让网站处于离线状态,而后覆盖发布的文件,再删除pp_offline.htm文件,让网站恢复在线状态测试
@echo off
call xcopy %~dp0UpdateFiles\app_offline.htm %~dp0
call xcopy %~dp0UpdateFiles\PublishFiles %~dp0 /s /e /Y
del %~dp0app_offline.htm
pause网站
1.实现简单spa
2.不用开发.net
1.复制app_offline.htm文件到发布路径以后,网站不能当即结束,须要等最后的请求结束,才能复制,否则以上脚本复制的时候会失败code
2.复制app_offline.htm文件到发布路径以后,时没有结束的请求返回的结果会最终会是空白内容,也即会是失败,这样会形成客户端发布的时候偶发性的失败问题htm
3.覆盖文件期间,网站处于离线状态,没法正常访问
来源:https://bbs.csdn.net/topics/395986630
以下代码,在一个控制器建立一个以下的方法,而后须要更新的时候Post这个方法就行。如下代码没有具体测试过,只测试过能够修改文件名字和application.StopApplication();会退出网站,因此应该是可行的。
[HttpPost] public IActionResult Update([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"); }
1.基本能够实现IIS的热发布
1.application.StopApplication();以后,当时没有结束的请求返回的结果会最终会是空白内容,也即会是失败,这样会形成客户端发布的时候偶发性的失败问题
2.现稍微复杂,需用开发
这个尚未来得及具体去Ⅹ,不过理论上是比较完美的解决方案,但实现起来有点复杂,其实就是利用Consul的高可用功能来实现,能够IIS中部署2个相同的网站服务,而后发布的时候一个个发布更新网站,更一个的时候,赞停另外一个,这样就能够在不影响客户端的状况下更新网站了。固然也能够用多服务器来实现高可用。
1.比较完美的实现热发布,实现高可用
1.须要搭建Consul,部署2个或多个网站
原本刚接触Core,但愿有经验的大佬推荐更加完善的解决方案。