我有一个正在在线发布的 .NET Core 3.1 应用程序 (api),并且我在 Visual Studio 中使用发布方法 FTP。 它工作得很好,但是当我在编码后尝试再次发布时,我总是收到这些错误:
这种情况在我的项目中的所有 dll 上持续了相当长的一段时间。我工作后发布的唯一方法是完全重置我的电脑,删除项目中必须发布的所有 bin 和 obj 文件夹,打开 VS 并发布,然后再执行其他操作。
我怀疑这与 VS 在我尝试发布时仍在某处/以某种方式使用 dll 有关。
我尝试在任务管理器中查找进程,但没有看到任何可能导致此问题的异常/问题。
任何与此相关的帮助将不胜感激,因为我喜欢为我编写的每条路由更新我的API以在部署的版本上进行测试,但这样很麻烦......
谢谢!
我认为这不是您的电脑。错误 550 是 FTP 错误。我认为这里发生的是,当您通过 FTP 发布您的网站并在浏览器中打开您的网站时,您实际上所做的是在服务器上运行您的应用程序。
当您的应用程序运行时,您无法修改正在使用的 DLL。
那么为什么重新启动电脑就能解决问题呢?这是因为这些托管提供商的配置是,如果一段时间内没有人请求某个网站,则终止该应用程序。这是因为节省内存和CPU。
因此,当您重新启动电脑并删除 bin 和 obj 文件夹并重建项目时,这需要时间,因为在此期间没有向您的网站发送请求,您的应用程序将被终止,现在您可以再次使用 FTP 更新您的网站。
要测试此场景,只需关闭浏览器,并在半小时内不要打开您的网站,然后尝试通过 FTP 更新您的网站。 或者,您可以重新启动 PC 并删除 bin 和 obj 文件夹,但在使用 FTP 推送文件之前,请在浏览器中打开您的站点。这必须运行您的应用程序并再次导致 550 错误。
我在 Azure 应用服务 (Linux) 中托管我的 Web 应用程序。即使应用程序服务停止,我也遇到了这个问题。 我能够使用 Kudu 的 SSH 列出我的服务器进程来解决这个问题:
ps aux
USER PID ... COMMAND
root 75 ... dotnet Project.dll
或使用 Kudu Process Explorer:https://{appname}.scm.azurewebsites.net/ProcessExplorer
然后杀死所有正在使用锁定文件的进程:
kill 75
之后,我就可以毫无问题地发布到 FTP!