【问题标题】:Fastest way to restart a .NET web app programmatically以编程方式重新启动 .NET Web 应用程序的最快方法
【发布时间】:2020-12-12 09:46:13
【问题描述】:

我正在为一个 Web 应用程序编写一些 e2e 测试,其中有很多我需要与之交互的代码超出了我的控制范围。为了在每个测试或测试组开始时设置我的应用程序,我打算使用 sql 脚本将数据库播种到已知状态,然后强制 Web 应用程序重新启动,以便我无法控制的所有内部缓存都被重置.

考虑到这一点,有谁知道哪种方法可以让我以最快的速度重新启动网络应用程序?

我的选择是:

  1. 触摸 web.config
  2. 在根目录中创建然后删除 app_offline.htm 文件
  3. 创建一些可以调用HttpRuntime.UnloadAppDomain的API

这些方法中的任何一种都比其他方法更快吗?它们实际上都一样吗?

【问题讨论】:

  • 您能否澄清一下:“以便我控制之外的所有内部缓存都被重置?”您是否担心数据查询被缓存? GAC 不会缓存数据结果,因此您无需担心重新启动应用程序。重新启动应用程序的“时间”成本很高,请确保您真的想要这样做。
  • 第三部分维护了一个缓存层,因此为数据库播种是不够的。此外,我不能确定第 3 部分代码正在缓存的所有内容,所以我只想重新启动为 ????当然。
  • 不确定第三部分是什么?或者它包含什么?如果您认为它包含缓存数据并且位于应用程序域之外,那么重新启动应用程序不会影响该缓存?我向您推荐了如何在测试/请求之间重新启动应用程序,但我想确保重新启动应用程序确实是您需要做的事情?

标签: asp.net performance e2e-testing warm-up application-warmup


【解决方案1】:

我建议,公开一个将清除/刷新缓存的端点。可以从您的 e/e 测试中获得该端点吗?

【讨论】:

  • 就像我说的,我无法控制所有代码,所以我无法清除不属于我的代码。
【解决方案2】:

使用选项#3:

System.Web.HttpRuntime.UnloadAppDomain();

此方法终止当前应用程序。应用程序在下次收到请求时重新启动。

见:https://docs.microsoft.com/en-us/dotnet/api/system.web.httpruntime.unloadappdomain?view=netframework-4.8

【讨论】:

  • 但是我要问的是这个重启速度比其他的快吗?
  • 从编程的角度和编程的角度来看,这会更快。此外,您不必乱用 web.config 或使用 app_offline.htm。
【解决方案3】:

根据您建议的方法:

  1. 触摸 web.config
  2. 在根目录中创建然后删除 app_offline.htm 文件
  3. 创建一些可以调用HttpRuntime.UnloadAppDomain的API

12 看起来都有些笨拙,需要编写单独的 API 才能以编程方式执行。 3 看起来不那么笨重,但肯定需要编写 API。

根据我的 cmets,我不确定是否需要重新启动应用程序或是否会完成您需要的操作,因为重新播种的数据不会缓存在 GAC 中。如果数据来自Web API,那么您可能会考虑重新启动该 API。最好的方法是通过[![IIS AppPool advanced settings][1]][1]

您要确保您的设置如下: 启动模式:按需 *空闲超时(分钟):0 空闲超时操作:终止

所有这些设置都是默认设置,但超时分钟数默认为 20。通过在您的应用程序或第三方 AP 上将其设置为 0,应用程序将终止(从 GAC 转储)并在新的 Web 请求时重新启动。

【讨论】:

  • 谢谢丹妮。重新缓存的数据,我知道它被缓存在“内存中”,所以重新启动应用程序似乎是确保一切都被清除的最可靠的方法。感谢您的建议,这不是我想过的。不确定这是否是我所需要的,因为该应用程序会在 e2e 测试期间发出很多请求。最终,我需要控制重启发生的时间,而不仅仅是在每次请求后进行全面重置。
  • 值得注意的是:数据查询结果缓存在数据库管理系统(服务器)中,而不是在Web应用程序中。当您重新设定数据时,您将重置数据缓存结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
  • 2011-05-22
  • 1970-01-01
相关资源
最近更新 更多