C# + WebForms + static -- 最佳实践是什么?

4
我很不喜欢WebForms,我更喜欢在.NET世界中使用ASP.NET MVC。但无论如何,我正在处理一个非常大的遗留WebForms应用程序的一小部分。
我正在集成Korzh.com的EasyQuery.NET,以允许最终用户创建基于预定义模型的SQL查询,这些模型使用别名使其更加用户友好。
这是相关的,因为Korzh的演示使用Global.asax作为其模型和查询类,以及Session。
由于遗留的WebForms应用程序非常庞大,因此不使用Global.asax进行页面特定项目。
我的解决方案是改用private static。静态变量在桌面应用程序中运行得很好,但在WebForms应用程序中似乎至少可能会引起一些麻烦。
我发现!IsPostBack不太可靠,我认为在WebForms中最佳实践可能是使用Session。Session的问题是它似乎随着HTML传递到客户端,并且可以以千字节为单位增长。
问题:
1.由于静态变量与WebForms一起使用时驻留在IIS服务器上,每个WebForms应用程序的用户是否共享相同的静态变量地址空间?(我认为答案是肯定的)。
2.在ASP.NET WebForms应用程序中使用/不使用静态变量的最佳实践/准则是什么?
谢谢。
1个回答

11
在 ASP.NET 中,静态实例将存活于应用程序的生命周期内,即网站应用程序本身的生命周期,在其被重启或关闭之前持续存在。例如:
public class Global : HttpApplication {
    public static string MyString
}
因此,静态属性可用于应用程序发出的所有请求。不适合存储特定于页面的项目。有很多存储机制可用:
  1. HttpRuntime.Cache和HttpContext.Cache都指向同一个缓存实例,并且项目存在于应用程序的生命周期内(因此具有与静态实例相同的问题)。
  2. HttpContext.Items是一组请求特定的项目。应用程序发出的每个请求都将拥有自己的项目集合。
  3. HttpSessionState会话持续了用户访问的长度,或者在超时时失效。可以通过以下4种方式配置:
  4. 3.a. InProc,会话对象由工作进程本身存储在内存中。快速访问缓存,不需要序列化,但如果应用程序重新启动,则会话数据丢失。

    3.b. SqlServer,会话对象被序列化并存储在 Sql Server 数据库中。要求所有存储在会话中的项目都可序列化。即使应用程序重新启动,会话对象仍然保留。

    3.c. StateServer,会话对象存储在单独的进程中,并在应用程序重新启动时保留数据。

    3.d. 自定义会话提供程序,取决于你...

  5. ViewState,这是将数据持久化到客户端的地方,并在页面视图之间将其提交到服务器以重建控件状态。
我会避免使用静态实例和 HttpRuntime 缓存来处理任何与用户相关的内容。使用这些机制来处理共享的通用信息,如配置、缓存等。会话很可能是您想要按用户存储东西的地方。如果您正在寻找每个页面的解决方案,则要简单得多,因为您只需将变量作为属性或字段的页面结构的一部分即可。您只需要管理这些字段的初始化。
希望能有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接