我绝对不是WebForms的粉丝,我更喜欢.NET世界的ASP.NET MVC。
无论如何,我正在研究一个非常大的遗留WebForms应用程序的一小部分。
我正在整合Korzh.com的EasyQuery.NET。允许最终用户根据预定义的模型创建自己的SQL查询,使用户友好的别名。
这是相关的,因为Korzh的演示使用Global.asax作为其模型和
查询类和Session。
因为遗留的WebForms应用程序非常大,所以没有使用Global.asax 用于页面特定项目。
我的解决方案是使用私有静态。静态在桌面上运行良好 应用程序,但似乎至少可能导致WebForms应用程序的一些悲伤。
我发现了!IsPostBack不太可靠,而且在我看来 在WebForms中,最佳实践可能是使用Session。有问题 会话是它似乎通过HTML传递给客户端并且可以增长 非常大的千字节。
问题:
由于静态变量在与WebForms一起使用时驻留在IIS服务器上,因此WebForms应用程序的每个用户是否共享相同的静态变量地址空间? (我认为答案是肯定的。)
使用/不使用静态变量的最佳做法/指南是什么? 使用ASP.NET WebForms应用程序?
谢谢。
问候,
格里(洛瑞)
P.S。:我找不到答案 通过Google或搜索SO。
答案 0 :(得分:11)
在ASP.NET中,静态实例将在应用程序的生命周期中存在,即Web应用程序本身,直到它被回收或关闭,例如:
public class Global : HttpApplication {
public static string MyString
}
因此,对应用程序发出的所有请求都可以访问静态属性。不是存储页面特定项目的地方。有很多存储机制可供使用:
HttpRuntime.Cache和HttpContext.Cache都指向同一个缓存实例,并且项目的生命周期中存在项目(因此与静态实例存在相同的问题)。
HttpContext.Items,一个特定于请求的项目集合。对应用程序发出的每个请求都有自己的项目集合。
HttpSessionState会话,持续用户访问的长度,或者超时。这可以通过4种方式配置:
3.A。在InProc中,会话对象由工作进程本身存储在内存中。快速访问缓存,不需要序列化,但如果应用程序循环使用,会话数据就会丢失。
3.B。 SqlServer,会话对象被序列化并存储在Sql Server数据库中。要求所有会话存储的项目都是可序列化的。即使应用程序回收,会话对象仍然存在。
3.C。 StateServer,会话对象存储在一个单独的进程中,并通过应用程序循环来保存数据。
3.D。自定义会话提供商,这取决于您....
ViewState,这是将数据持久保存到客户端并发回服务器以重建页面视图之间的控制状态的地方。
我会避免使用静态实例和HttpRuntime缓存来处理与用户相关的任何内容。将这些机制用于共享的公共信息,例如配置,缓存等。会话可能是您希望按用户存储内容的地方。如果您正在寻找每页解决方案,那么它更简单,因为您只需将变量本身作为属性或字段的一部分。您只需要管理这些字段的初始化。
希望有所帮助。