【问题标题】:What is the preferred approach to initialize one-time logic in ASP.NET 3.5 WebForms?在 ASP.NET 3.5 WebForms 中初始化一次性逻辑的首选方法是什么?
【发布时间】:2012-07-11 03:14:47
【问题描述】:

场景:

  • 我有一个基于 ASP.NET 3.5 WebForms 的网站。
  • 它包含Foo.aspxBar.aspxbaz.html(jQuery 模板)。
  • 看到的典型流量是Foo.aspx(N 次)、Bar.aspx(N 次)和baz.html(10*N 次)。
  • ASP.NET 工作进程 (aspnet_wp.exe) 每 2 小时回收一次。
  • 存在一个较旧的 API (OldFooService.Init()),仅需要为 Foo.aspx 的第一个请求执行。 OldFooService.Init() 为第一个流初始化一个数据存储到 Cache,但为后续流触发空白。

问题:

我目前正在做 B(见下文),因为 Foo.aspx 的流量低于 baz.htmlOldFooService.Init() 在第一次后触发空白。

我应该使用 C 吗?写信给Application_State 需要锁定(MSDN)并且不能保证它可用,所以不确定它是否值得努力。还是有更好的 D?

选项:

A) 在Application_Start 中的Global.asax

B) 在Foo.aspxPage_Load 中一次(通过检查Not IsPostBack

C) 选项 B + 在ApplicationState 中使用一个标志,以在每次循环使用aspnet_wp.exe 时运行一次。

【问题讨论】:

  • 答案似乎非常明显,A。我很好奇你为什么犹豫并决定问 SO?
  • 更新了我的问题。旧服务只需要为 Foo.aspx 的第一个请求运行。由于 baz.html 的流量较高,而且 aspnet_wp.exe 会不断回收,不需要旧服务,因此我犹豫是否在 Global.asax 中初始化。
  • Application_Start 只触发一次,当工作进程启动时,每 2 小时执行一次似乎还不错。我们在谈论什么类型的缓存?
  • 旧服务使用 HttpContext.Current.Cache。
  • 我们所说的缓存有多大?从开始到结束,您的 OldFooService.Init() 需要多长时间才能运行?内存占用是多少?

标签: c# asp.net vb.net webforms application-state


【解决方案1】:

如果 OldFooService.Init() 在初始化之前同时收到请求的情况下可以额外调用几次,那么我会选择 C。如果它绝对必须在每次回收时运行一次,那么我会使用具有一些适当的读/写锁的静态类。

顺便说一句,工作进程实际上是每 2 小时回收一次吗?这似乎相当频繁。

【讨论】:

  • 感谢您的回答。频繁的回收只是自动化构建开发/测试环境的副作用。我可以看到我的话是如何描绘错误的上下文的,以后会注意避免这种情况。
【解决方案2】:

这里的正确答案是(A),使用 Global.asax。 B 将不起作用,因为后续 GET 请求将运行相同的代码。 C 可以工作,但丑得像罪。

我建议在 Global.asax 中处理 Application_Start 或 Application_Init,具体取决于您的旧版 init 函数中的要求。

【讨论】:

  • 感谢您的回答。对不起,我没有正确表达我的场景。旧服务只需要为 Foo.aspx 的第一个请求运行。由于 baz.html 的流量较高,而且 aspnet_wp.exe 会不断回收,不需要旧服务,所以我犹豫是否在 Global.asax 中初始化。
  • 问题是,在您的工作进程的 2 小时生命周期中,是否 N > 1(访问 Foo.aspx 的次数)?如果是这样,在 Global.asax 中定位逻辑仍然有意义。另外,为什么你的工作进程被如此频繁地回收?
猜你喜欢
  • 2014-12-29
  • 1970-01-01
  • 2014-11-14
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 1970-01-01
  • 2011-05-10
  • 2012-05-18
相关资源
最近更新 更多