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账户,赋予读写权限即可.重复发布服务,成功发布.
随机推荐
- 题解 P1541 【乌龟棋】
题目描述 乌龟棋的棋盘是一行\(N\)个格子,每个格子上一个分数(非负整数).棋盘第\(1\)格是唯一的起点,第\(N\)格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点. 乌龟棋中\(M\) ...
- c#方法 最大值我最小值
static void Main(string[] args) { int[] a = { 6, 8, 9, 5, 2, 165, 58966 }; Console.WriteLine("最 ...
- leetcode21 surrounded regions
题目描述 现在有一个仅包含'X'和'O'的二维板,请捕获所有的被'X'包围的区域 捕获一个被包围区域的方法是将被包围区域中的所有'O'变成'X' 例如 X X X X↵X O O X↵X X O X↵ ...
- CORS与Django
前言 在前后端分离项目中,如何解决跨域请求是一个必须要面对的问题.因为前端和后端的数据交互会被浏览器的同源策略所挟持,在很早之前我在博客园发了一篇文章,大概就说了一下如何简单粗暴的解决跨域. 其实那种 ...
- 获取url后面的参数
function getQueryVariable(variable) { var query = window.location.search.substring(1); var vars = qu ...
- 腾讯云对象存储COS新品发布——智能分层存储,自动优化您的存储成本
近日,腾讯云正式发布对象存储新品--智能分层存储,能够根据用户数据的访问模式,自动地转换数据的冷热层级,为用户提供与标准存储一致的低延迟和高吞吐的产品体验,同时具有更低的存储成本. 熟悉数据存储的用户 ...
- 炸了!一口气问了我18个JVM问题!
前言 GC 对于Java 来说重要性不言而喻,不论是平日里对 JVM 的调优还是面试中的无情轰炸. 这篇文章我会以一问一答的方式来展开有关 GC 的内容. 不过在此之前强烈建议先看这篇文章深度揭秘垃圾 ...
- 《<SPRING5高级编程(第5版)>_王净译》笔记-【目录】
第一次写这玩意,不知道什么时候能写完,今天项目比较近,期望年底能看完吧. 先定个小目标 20201228 完成 第1章 Spring介绍 第2章 入门 第3章 在Spring中引入IoC和DI 第4章 ...
- ubuntu12.10安装sun java jdk
add-apt-repository ppa:webupd8team/java apt-get update apt-get install oracle-java6-installer root@k ...
- SpringCloud Alibaba+New搭建企业级开发框架(三):创建New工程
1.创建父工程:File > New > Project...,选择Maven,Create from archetype不要勾选,点击Next进入下一步,填写工程信息. image. ...