我有一个带有多个部署槽的 Azure 网站。我使用 Visual Studio 部署到暂存槽,然后将其交换到生产中。
我的 Visual Studio 解决方案包含一个用于我的 Web 应用程序的项目和另一个用于连续 WebJob 的项目。我曾经(Right-click project) > Add > Existing Project as Azure WebJob
配置要与 Web 应用程序一起部署到站点的 WebJob。
我的问题是WebJob 有时会在交换后继续运行旧代码。有时它会在一次调用时运行新代码,然后在下一次调用时切换回旧代码。我似乎无法找出押韵或原因。
今天早上,为了尝试找出造成这种情况的原因,我做了以下实验:
- 在暂存中删除 WebJob。
- 删除生产中的 WebJob。
- 将 Web 应用程序部署到暂存。
- 验证 WebJob 是否在 Staging 中运行新代码。
- 将分段转换为生产。
- 确认 WebJob 不再出现在 Staging 中,并且它现在出现在 Production 中。
我发现,在第 4 步之后,所有 WebJob 函数都在 Staging 中重新启动,并且都在运行新代码。但是在我将 Staging 切换到 Production 之后,在 Production 中没有新的 WebJob 调用,当我手动调用它时,旧代码运行了!
这到底是怎么回事?如何彻底清除旧代码并确保新的 WebApp 代码能够在生产环境中运行?
我确实看到另一个线程说选中Exclude files from the App_Data folder
发布设置中的框可能会导致此问题,但我没有检查它。
我觉得我在这里服用疯狂的药丸。任何指针将不胜感激。
更新 1:正如我在下面的评论中所述,我已经放弃并切换到 Azure Functions,但我只是想到了一些可以帮助遇到此问题的其他人的东西。我记得至少有一次或两次,我通过手动上传 zip 文件而不是通过 Visual Studio 部署来部署我的 WebJob。我开始怀疑,是否有可能在幕后使用不同的代码路径会导致这种行为。也许这对某人来说是一个有用的指针。
更新2:我已经弄清楚发生了什么。我正在描述这一点,希望它可能对将来的某人有所帮助。
我们有几个部署槽:Staging、Production 和其他一些。一个这样的插槽称为副本。它的目的是成为生产的副本(相同的代码,相同的配置设置)。这个想法是,对于那些仅在生产中重现的奇怪的一次性问题,您可以将调试构建上传到副本插槽并附加调试器而不会中断生产。
这有时很有用,但我们并不经常使用它。结果是,在 Replica 插槽中运行的代码,包括我们的 WebJob 代码,与在生产中运行的代码相比,逐渐变得越来越过时。然而,与此同时,Replica WebJobs 继续运行旧代码,并且由于 Replica slot 具有与 Production 相同的所有配置设置,它与我们的 Production WebJobs使用相同的数据运行并写入相同的日志。因此,当我查看我的生产 WebJob 日志时,我会看到我知道不应该再存在的输出,但我不知道为什么。流氓代码实际上是在我忘记的另一个插槽中运行的。
于是,谜团解开了。这可能意味着我们不需要将所有内容都转移到 Azure Functions。但我仍然很高兴我们做到了。我更喜欢他们。我喜欢我们可以选择在与我们的网站相同的应用服务或单独的应用服务中运行它们,并且日志系统更好。整体感觉更现代。
无论如何,我希望这可以帮助那里的人。