无法通过部署插槽交换更新Azure WebJob代码

问题描述

我有一个带有多个部署槽的Azure网站。我使用Visual Studio部署到暂存插槽,然后将其交换到生产环境。

我的Visual Studio解决方案包含一个用于我的Web应用程序的项目,另一个用于连续的WebJob。我使用(Right-click project) > Add > Existing Project as Azure WebJob将WebJob配置为与Web应用程序一起部署到站点

我的问题是 WebJob有时在交换后仍继续运行旧代码。有时,它在一次调用时运行新代码,然后在下一次调用时切换回旧代码。我似乎无法弄清楚这的押韵或原因。

今天早晨,为了找到原因,我做了以下实验:

  1. 在暂存中删除WebJob。
  2. 删除生产中的WebJob。
  3. 将Web应用部署到登台。
  4. 验证WebJob是否正在Staging中运行新代码
  5. 将试生产转移到生产中。
  6. 验证WebJob不再显示在暂存中,并且现在显示在生产环境中。

我发现,在第4步之后,所有WebJob函数都从Staging重新开始,并且都在运行新代码。但是,在我将“暂存”转换为“生产”之后,生产中没有新的WebJob调用,而当我手动调用它时,旧代码就运行了!

这到底是怎么回事?如何完全清除旧代码并确保新的WebApp代码将在生产环境中运行?

我确实看到another thread说过在发布设置中选中Exclude files from the App_Data folder框可能会导致此问题,但是我没有选中它。

我觉得我在这里服用疯药。任何指针将不胜感激。


更新1:正如我在下面的评论中所述,我已经放弃并切换到Azure函数,但是我只是想到了一些可以帮助遇到此问题的人的方法。我记得至少一次或两次,我通过手动上传一个zip文件而不是通过Visual Studio进行部署来部署我的WebJob。我开始怀疑,是否可能在幕后使用了另一个可能导致这种现象的代码路径。也许这将对某人有用。


更新2:我已经弄清楚发生了什么事情。我正在对此进行描述,希望是将来对某人有所帮助。

我们有几个部署槽:暂存,生产和其他几个。这样的插槽之一称为副本服务器。其目的是成为生产的副本(相同的代码,相同的配置设置)。想法是,对于那些仅在生产环境中出现的奇怪的一次性问题,您可以将调试版本上载到副本插槽,并连接调试器而不会中断生产。

这有时会很有用,但是我们并不经常使用它。结果是,与生产环境中运行的代码相比,在副本槽中运行的代码包括我们的WebJob代码)逐渐变得过时。但是,与此同时,副本WebJobs继续运行旧代码,并且由于副本插槽具有与Production相同的所有配置设置,因此它在与我们Production相同的数据上进行操作并写入相同的日志 WebJobs。因此,当我查看生产WebJob日志时,会看到我知道不再存在的输出,而且我不知道为什么。流氓代码实际上在我忘记的另一个插槽中运行。

所以,谜团解决了。这可能意味着我们不需要将所有内容都切成Azure函数。但是我仍然很高兴我们做到了。我更喜欢他们。我喜欢我们可以选择在与站点相同或单独的应用程序服务中运行它们,并且日志记录系统更好。总体感觉更现代。

无论如何,我希望这对在那里的人有所帮助。

解决方法

通常,在成功交换并重新启动Web应用程序之后,不可能运行旧代码。因此,您可以在kudu https://YourWebApp.scm.azurewebsites.net/DebugConsole中检查site-> wwwroot 下的内容,以确保您的网络作业正确。