解决NET Core发布iis项目覆盖原有的项目时"另一个程序正在使用此文件,进程无法访问"

-

前段时间,系统升级,由于系统更新发布时间较长,所以必须停掉站点进行更新。导致很多用户都来反馈系统无法访问,还认为站点被黑掉了。


所以经过那件事我们也在思考,如何做到不停机,进行热部署。

单机环境下(双机或是分布式系统不用考虑这个问题),app_offline.htm是个不错的选择,

当asp.net看到应用程序中app_offline.htm文件时,它会关闭应用程序的app-domain,然后将请求发给app_offline的内容。

所以,在维护,升级的时候,就不必停止你的WEB应用程序,而是一个友好的方式提示给用户,本网站正在更新的提示,这样体验会更友好。

 

1. 创建一个app_offline.htm的HTM页面文件,

<html>

<head>

<meta http-equiv="Content-Type"

content="text/html; charset=gb2312">

<title>站点更新中</title>

</head>

<style>

div {

background-color:#ffffcc;

padding-top:10px;

padding-bottom:10px;

padding-left:10px;

padding-right:10px;

border-style:solid;

border-color:Black;

border-width:1px;

}

</style>

<body>

<div>

<h1>站点更新中</h1>

<p>站点更新中,请稍后访问。</p>

</div>

</body>

</html>

或者使用命令行

$pathToApp = '{PATH TO APP}'
New-Item -Path $pathToApp -Name "app_offline.htm" -ItemType "file"
# Provide script commands here to deploy the app
Remove-Item -Path $pathToApp\app_offline.htm

2. 将app_offline.htm放在你的网站根目录下。这样,任何外部的请求的话,都会马上被转移到该页面了。

需要注意的是:

(1)app_offline.htm 不能小于 512 字节。

(2)IIS 站点和进程池不需要停止。

(3)只有对.aspx文件的请求才自动转到app_offline.htm文件;如果请求的是.htm, .asp等文件,则不会转到app_offline.htm


结合官方文档,找到了一个目前看算是比较好的解决方案

好点的解决方案(一次配置后,1秒钟更新):

  1. 在D盘根目录创建一个app_offline.htm文件,注意是.htm文件,不是.html

  2. 创建一个待发布文件夹,把需要更新的项目文件放到该目录下

  3. 创建一个bat执行文件,内容如下,通过bat文件完成更新 

bat执行文件内容,直接拷贝后替换路径即可

@echo off
call xcopy D:\app_offline.htm D:\运行的项目
call xcopy D:\待发布项目 D:\运行的项目 /s /e /Q /Y /I
del D:\运行的项目\app_offline.htm

bat文件对应每一行的注释:

  1. 复制D盘根目录的app_offline.htm文件到项目运行的目录,接管所有的请求

  2. 复制待发布的文件到项目运行的目录完成覆盖更新

  3. 删除app_offline.htm文件恢复项目正常运行

阅读次数:

相关文章!