0

设想:

  • 我有一个基于 ASP.NET 3.5 WebForms 的网站。
  • 它包含Foo.aspx,Bar.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?

选项:

一)Application_StartGlobal.asax

B)Page_Load一次Foo.aspx(通过检查Not IsPostBack

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

4

2 回答 2

4

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

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

于 2012-07-11T13:31:50.523 回答
1

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

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

于 2012-07-11T13:47:38.670 回答