关于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的热发布问题或者报错文件已在另一个程序中打开的更多相关文章

  1. 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 ...

  2. 为 VUE 项目添加 PWA 解决发布后刷新报错问题

    为什么要给 VUE 项目添加 PWA 为什么要添加?因为不管是部署在 IIS,还是 nginx,每次应用部署后,再次访问因为旧的 js 已经不存在,所以页面访问的时候会整个报错,报错的结果就是一个白屏 ...

  3. Asp.Net Core使用System.Drawing.Common部署到docker报错问题

    Asp.Net Core 2.1发布后,正式支持System.Drawing.Common绘图了,可以用来做一些图片验证码之类的功能.但是把网站部署到docker容器里运行会遇到很多问题,也是非常闹心 ...

  4. 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 ...

  5. IIS:错误: 无法提交配置更改,因为文件已在磁盘上更改

    文件名: \\?\C:\Windows\system32\inetsrv\config\applicationHost.config 错误: 无法提交配置更改,因为文件已在磁盘上更改 通过 Micro ...

  6. 使用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 ...

  7. 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方面 ...

  8. swagger 集成后发布到服务器报错[Could not find file 'D:\\home\\site\\wwwroot\\bin\\WebAPI.XML]

    webapi集成swagger后,在本地运行没有问题,但是发布到服务器上就有问题. 报错信息:Could not find file 'D:\\home\\site\\wwwroot\\bin\\We ...

  9. arcgis server10.2发布地图服务报错

    发布地图服务时,读取了本机电脑中的切片方案.发布服务,报打包成功,但发布失败错误. 解决办法:给arcgis账户,赋予读写权限即可.重复发布服务,成功发布.

随机推荐

  1. 庐山真面目之二微服务架构NGINX版本实现

    一.简介          在上一篇文章<庐山真面目之微服务的简介和技术栈>中,我们已经探讨了微服务的来龙去脉,也说了想要实现微服务架构所需要的技术栈,今天我们开始实现一个微服务,当然这个 ...

  2. Centos7系统kvm虚机忘记密码进不去, 通过宿主机修改/etc/shadow文件改密码,重启后系统起不来故障排错

    问题描述 某天, 因为其他项目组交接问题, kvm里面的堡垒机系统用户root密码登录不上,然后他通过宿主机修改/etc/shadow文件修改密码,但是修改完后重启系统后发现kvm宿主机连接不上虚机了 ...

  3. php抽奖程序

    //php概率抽奖算法 1.获取总的概率数 2.随机从1到总概率数 3.判断获取的随机数是否在小于等于(就是你随机的数是否在数组值得范围中比如数组为array(1,2,3,4,5,6)则随机出了一个数 ...

  4. Electron入门指北

    最近几年最火的桌面化技术,无疑是Qt+和Electron. 两者都有跨平台桌面化技术,并不局限于Windows系统.前者因嵌入式而诞生,在演变过程中,逐步完善了生态以及工具链.后者则是依托于Node. ...

  5. VBA_Copy数据及数据格式_DoLoop删除空行

    Sub copyreport() Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Ap ...

  6. CSS3之animation属性

    CSS中的animation属性可用于为许多其他CSS属性设置动画,例如颜色,背景色,高度或宽度. 每个动画都需要使用@keyframes这种at-rule语句定义,然后使用animation属性来调 ...

  7. ubuntu配置简单的DNS服务器

    之所以说是简单的服务器,实现的功能很简单,通过这个dns server 查询制定域名的时候,能够根据设置的值来返回IP,当前的需求是需要轮询的返回IP DNS 轮询机制会受到多方面的影响,如:A记录的 ...

  8. python爬虫分析报告

    在python课上布置的作业,第一次进行爬虫,走了很多弯路,也学习到了很多知识,借此记录. 1. 获取学堂在线合作院校页面 要求: 爬取学堂在线的计算机类课程页面内容. 要求将课程名称.老师.所属学校 ...

  9. a^b(取模运算)

    a^b(sdtbu oj 1222) Description 对于任意两个正整数a,b(0 <= a, b < 10000)计算ab各位数字的和的各位数字的和的各位数字的和的各位数字的和. ...

  10. 死磕以太坊源码分析之Kademlia算法

    死磕以太坊源码分析之Kademlia算法 KAD 算法概述 Kademlia是一种点对点分布式哈希表(DHT),它在容易出错的环境中也具有可证明的一致性和性能.使用一种基于异或指标的拓扑结构来路由查询 ...