dll文件更改时重新加载ASP.NET Core应用(bin部署)

时间:2018-09-06 13:09:01

标签: asp.net ubuntu asp.net-core asp.net-core-2.1 kestrel-http-server

环境:ASP.NET Core 2.1,Ubuntu。

在旧式ASP.NET中,当我进行bin部署(例如,上载了一些dll文件)时,webapp会检测到该情况并重新加载自身-非常有用。

使用Core不能做到这一点。我需要停止并重新启动dotnet MyApp.dll进程。

如何使它检测二进制文件的更改并重新加载?

2 个答案:

答案 0 :(得分:3)

Ubuntu中的文件监视程序可以在文件systemdinotify等更改时发出重新启动命令,但是我强烈建议您这样做。上载可能会暂停或变慢,并且上载50个文件时,每隔几秒钟就会重新启动一次。服务器无法知道何时完成上一个DLL的上传。 IIS具有相同的问题,它在开发中是可靠的,因为在完全重建DLL之后刷新页面。但是,在生产中,您不希望随机访问者在您的网站仍在上传时中途启动它。错误,文件锁定,各种奇怪的事情都可能发生。

正如Chris Pratt指出的那样,您想要编写部署工作流程的脚本。了解您正在开发的环境,但是如果您拥有Visual Studio和WinSCP,则就像用Scripting and Task Automation编写几行代码一样容易。

然后,您的发布工作流程可以例如如下:

  1. 在Visual Studio中进行发布
  2. 发布完成后,VS将执行winscp脚本
    • 在远程服务器上进行身份验证
    • 将发布文件夹上传到远程文件夹
    • 删除旧文件
    • 修剪日志
    • 完成systemctl restart kestrel-myapp命令发出的命令
  3. 然后单击一下,以最可靠的方式部署,清理和重新启动您的网站。

答案 1 :(得分:1)

我不知道有什么能帮到您。 IIS监视bin目录,web.config等内容,并在检测到更改时回收应用程序池,但这是因为它知道。它也是功能齐全的Web服务器,对文件更改进行回收的App Pool是这些功能之一。红est,我假设您使用的是 not 。这是一个非常简单的Web服务器,可以像严格意义上的Web服务器一样执行所需的操作。这就是为什么像IIS,Apache,Nginx等更传统的Web服务器通常用作Kestrel前面的反向代理-提供更多高级功能的原因。

尽管如此,这实际上只是您的发布策略的问题。就个人而言,我鼓励您使用比粘贴粘贴的DLL更强大的功能,但是如果您想采用这种方式,也可以 script 。创建一个Shell脚本以复制bin目录,然后重新启动您的应用程序。您的发布应尽可能地是一条轨道。每次需要人工干预时,您都有潜在的失败点,因为人类天生就容易犯错。但是,脚本一旦经过测试并确保可以正常工作,则每次都会工作很多,因为它总是以相同的顺序执行相同的事情。