对使用中的网站进行维护时,通常需要将网站临时关闭,进行文件更新等操作,然后再开启,以避免在更新文件过程中,客户端读到不一致的内容。(如果是在负载均衡场景下就不需要这么麻烦,可以与负载均衡配合,进行客户端无感知更新了。)
但直接关闭网站或者杀掉进程,可能会导致正在进行的 request 处理意外中断,没有全面使用事务的话有可能导致数据不一致,系统数据被破坏。而且客户端/浏览器访问直接就服务端 503 出错,给人的观感相当不好。
是使用 iis 部署的 asp.net (core) 程序的话,有个更优雅点的方式,就是直接将一个名为 App_offline.htm 的文件放置到 web application 的根目录下。iis 检测到该文件之后,对所有之后新到的 request 都返回该文件的内容,同时等到一段时间(默认 10 秒)后关闭 web application,有 10 秒,基本上可以保证正在处理的 request 的应用逻辑都跑完。此时你就可以从容更改网站内容了。
更改完之后,将该文件删掉。下一个请求又重新访问到 web application 的内容了。
几个注意的点:
App_offline.htm,区分大小写。