繁体   English   中英

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

[英]c# + WebForms + static — what are the best practices?

我绝对不是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应用程序中使用/不使用静态变量的最佳实践/指南是什么?

谢谢。
问候,
格里(洛瑞)

PS:我找不到答案
通过Google或搜索SO。

在ASP.NET中,静态实例将在应用程序的生命周期中存在,即Web应用程序本身,直到它被回收或关闭,例如:

public class Global : HttpApplication {
    public static string MyString
}

因此,对应用程序的所有请求都可以访问静态属性。 不是存储页面特定项目的地方。 有很多可用的存储机制:

  1. HttpRuntime.Cache和HttpContext.Cache都指向相同的缓存实例,并且在应用程序的生命周期中存在项目(因此与静态实例具有相同的问题)。

  2. HttpContext.Items,特定于请求的项目集合。 对应用程序发出的每个请求都有自己的项目集合。

  3. HttpSessionState会话,持续用户访问的长度,或者每当超时时。 这可以通过4种方式配置:

    3.A. 在InProc中,会话对象由工作进程本身存储在内存中。 快速访问缓存,不需要序列化,但如果应用程序循环使用,会话数据将丢失。

    3.B. SqlServer,会话对象被序列化并存储在Sql Server数据库中。 要求所有会话存储的项目都是可序列化的。 即使应用程序循环使用,会话对象仍然存在。

    3.C. StateServer,会话对象存储在单独的进程中,并通过应用程序循环来保存数据。

    3.D. 自定义会话提供商,这取决于你....

  4. ViewState,这是将数据持久保存到客户端并发回服务器以重建页面视图之间的控制状态的位置。

我会避免使用静态实例和HttpRuntime缓存来处理与用户相关的任何事情。 将这些机制用于共享的公共信息,例如配置,缓存等。会话可能是您希望按用户存储内容的地方。 如果您正在寻找每页解决方案,那么它更简单,因为您只需将变量本身作为属性或字段的一部分。 您只需管理这些字段的初始化。

希望有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM