Core在IIS的热发布问题或者报错文件已在另一个程序中打开
关于Core发布到IIS的热发布问题,或者覆盖dll文件的时候会报错"文件已在另一个程序中打开",也就是无法覆盖程序的问题,经过百度和分析总结以下几种方案:
一、使用app_offline.htm文件,这个方案网上最多:
1.具体步骤:
1)在发布路径新建一个文件夹"UpdateFiles"
2)文件夹"UpdateFiles"里面放一个app_offline.htm文件,这个文件是网站处于离线状态的时候的返回给客户端的页面内容
3)文件夹"UpdateFiles"里面放一个"PublishFiles"文件夹,这个文件夹里面放需要发布的文件
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
2.利弊分析:
好处:
1.实现简单
2.不用开发
弊端:
1.复制app_offline.htm文件到发布路径之后,网站不能立即结束,需要等最后的请求结束,才能复制,不然以上脚本复制的时候会失败
2.复制app_offline.htm文件到发布路径之后,时没有结束的请求返回的结果会最终会是空白内容,也即会是失败,这样会造成客户端发布的时候偶发性的失败问题
3.覆盖文件期间,网站处于离线状态,无法正常访问
二、改文件名字,然后复制发布程序,然后退出网:
来源:https://bbs.csdn.net/topics/395986630
1.具体步骤:
如下代码,在一个控制器创建一个如下的方法,然后需要更新的时候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");
}
2.利弊分析:
好处:
1.基本可以实现IIS的热发布
弊端:
1.application.StopApplication();之后,当时没有结束的请求返回的结果会最终会是空白内容,也即会是失败,这样会造成客户端发布的时候偶发性的失败问题
2.现稍微复杂,需用开发
三、使用Consul这种服务管理软件(推荐):
1.具体实现:
这个还没有来得及具体去Ⅹ,不过理论上是比较完美的解决方案,但实现起来有点复杂,其实就是利用Consul的高可用功能来实现,可以IIS中部署2个相同的网站服务,然后发布的时候一个个发布更新网站,更一个的时候,赞停另一个,这样就可以在不影响客户端的情况下更新网站了。当然也可以用多服务器来实现高可用。
2.利弊分析:
好处:
1.比较完美的实现热发布,实现高可用
弊端:
1.需要搭建Consul,部署2个或多个网站
本来刚接触Core,希望有经验的大佬推荐更加完善的解决方案。
Core在IIS的热发布问题或者报错文件已在另一个程序中打开的更多相关文章
- maven发布到tomcat报错: Publishing failed Could not publish to the server. java.lang.IndexOutOfBoundsException
eclipse中将maven项目发布到tomcat报错时: Publishing failed Could not publish to the server. java.lang.IndexOutO ...
- 为 VUE 项目添加 PWA 解决发布后刷新报错问题
为什么要给 VUE 项目添加 PWA 为什么要添加?因为不管是部署在 IIS,还是 nginx,每次应用部署后,再次访问因为旧的 js 已经不存在,所以页面访问的时候会整个报错,报错的结果就是一个白屏 ...
- Asp.Net Core使用System.Drawing.Common部署到docker报错问题
Asp.Net Core 2.1发布后,正式支持System.Drawing.Common绘图了,可以用来做一些图片验证码之类的功能.但是把网站部署到docker容器里运行会遇到很多问题,也是非常闹心 ...
- Visual Studio发布Web项目报错:Unable to add 'xxx' to the Web site. Unable to add file 'xxx'. The specified file could not be encrypted.
背景 Visual Studio下的Web项目 现象 发布时遇到Unable to add 'xxx' to the Web site. Unable to add file 'xxx'. The ...
- IIS:错误: 无法提交配置更改,因为文件已在磁盘上更改
文件名: \\?\C:\Windows\system32\inetsrv\config\applicationHost.config 错误: 无法提交配置更改,因为文件已在磁盘上更改 通过 Micro ...
- 使用CXF发布的WebService报错:org.apache.cxf.interceptor.Fault: The given SOAPAction does not match an operation
场景:JAVA语言使用CXF搭建WebService发布报错 错误信息:org.apache.cxf.interceptor.Fault: The given SOAPAction does not ...
- DYNAMICS 365发布所有时候报错:appmodule With Id = a7a513b1-c87d-e911-a83a-000d3a375321 Does Not Exist
我是微软Dynamcis 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...
- swagger 集成后发布到服务器报错[Could not find file 'D:\\home\\site\\wwwroot\\bin\\WebAPI.XML]
webapi集成swagger后,在本地运行没有问题,但是发布到服务器上就有问题. 报错信息:Could not find file 'D:\\home\\site\\wwwroot\\bin\\We ...
- arcgis server10.2发布地图服务报错
发布地图服务时,读取了本机电脑中的切片方案.发布服务,报打包成功,但发布失败错误. 解决办法:给arcgis账户,赋予读写权限即可.重复发布服务,成功发布.
随机推荐
- python语言编程算法
编程题 1 台阶问题/斐波那契 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. fib = lambda n: n if n <= 2 else fi ...
- SU+GIS,让SketchUp模型在地图上活起来
一.SU+GIS的场景展示 skp与卫星地图和倾斜摄影模型相结合人工模型与实景模型完美融合 这么一看是不是直接秒杀了单纯看看skp后联想的规划效果? 二.如何快速把草图大师的结果和GIS结合呢?在图新 ...
- python菜鸟教程学习1:背景性学习
https://www.runoob.com/python3/python3-intro.html 优点 简单 -- Python 是一种代表简单主义思想的语言.阅读一个良好的 Python 程序就感 ...
- 手写@koa/router源码
上一篇文章我们讲了Koa的基本架构,可以看到Koa的基本架构只有中间件内核,并没有其他功能,路由功能也没有.要实现路由功能我们必须引入第三方中间件,本文要讲的路由中间件是@koa/router,这个中 ...
- prometheus函数介绍
一 函数介绍 gauge类型的数据 属于随机变化数值,并不像counter那样 是 持续增长 1 increase() increase 函数 在promethes中,是⽤来 针对Counter 这 ...
- python pip install指定国内源镜像
有时候安装一些依赖包,网不好,直接超时,或者这个包就是死都下不下来的时候,可以指定国内源镜像. pip install -i 国内镜像地址 包名 e.g. pip install -i http:/ ...
- Fiddler的一系列学习瞎记2(没有章法的笔记)
前言 不适合小白,因为很多需要小白来掌握的东西我都没有写,就是补充自己还不会的东西,所以,有些同僚看起来可能感觉不是很清楚. 正文: 瞎记2-什么是代理服务器 1.web代理服务器,是在客户端和服务器 ...
- 这 5 个开源的能挣钱的 SpringBoot 项目,真TMD香!
不得不佩服 Spring Boot 的生态如此强大,今天我给大家推荐几款 Gitee 上优秀的后台开源版本的管理系统,小伙伴们再也不用从头到尾撸一个项目了,简直就是接私活,挣钱的利器啊. SmartA ...
- classmethod、staticclassmethod内置装饰器函数
# method 英文是方法的意思 # classmethod 类方法 # 当一个类中的方法中只涉及操作类的静态属性时,此时在逻辑上,我们想要直接通过类名就可以调用这个方法去修改类的静态属性,此时可以 ...
- 从执行上下文角度重新理解.NET(Core)的多线程编程[1]:基于调用链的”参数”传递
线程是操作系统能够进行运算调度的最小单位,操作系统线程进一步被封装成托管的Thread对象,手工创建并管理Thread对象已经成为了所能做到的对线程最细粒度的控制了.后来我们有了ThreadPool, ...