有没有比使用会话变量更好的解决方案;会话变量真的应该在网页中使用吗?

时间:2012-12-12 15:17:04

标签: c# session-variables webmatrix

我正在使用WebMatrix(C#)为我工作的组织设计Intranet Web应用程序。

我已经创建了一个数据库驱动的站点,并且我正在处理另一个站点,并且一段时间以来,我遇到了一些麻烦,Session变量随机变为null并抛出错误。所以,一个简单的Session变量改为使用服务器缓存内存(我最初认为它会更加不稳定,但到目前为止还有待观察......)

一个问题是:Session变量是否有任何实际用途?如果它真的像它看起来那样挥之不去,那么它们似乎几乎没有任何好处。\

我知道它们在技术上是饼干,所以我知道不应该依赖它们的数据,但其中存在问题。我需要将数据发送到我“可以”依赖的其他页面。这会遗漏会话变量和cookie。

我通常远离查询字符串或网址数据,因为他们对任何敏感信息(如社会安全号码)的公然“纯文本”显示,甚至SSL都无法帮助。

服务器高速缓存存储器也是易失性的,不能依赖它。

AppState变量不是用户特定的。

这留下了隐藏的输入字段......这里的问题是,有时候在“发布”之后我会做Response.Redirect等等,所以C#并不总是在帖子之后呈现一个页面(似乎)。

也许这只是我缺乏知识,但无论我走哪条路,我都有点走投无路。

我是否真的必须将所有页面信息保存到每个页面的单独数据库中,并在另一页上使用sql查询检索它只是为了获得可靠而不是“公然”显示的信息从一个页面到另一个页面使用网页?即使这种方法使用几个不同的用户也是一个问题,不是吗?

1 个答案:

答案 0 :(得分:2)

ASP.NET具有不同的会话状态模式:

  • InProc ,这是内存中的。只要IIS应用程序池未被回收或整个IIS重新启动,会话状态就会存在。

  • SqlServer的。这是会话状态存储在SQL Server存储中。这很好,因为会话在IIS应用程序池或整个IIS重新启动后仍然存在,但它是一个瓶颈,因为它意味着每次访问会话都需要对会话状态对象进行反序列化和/或序列化,毕竟,数据库连接等等上。

  • 的StateServer 。与 SqlServer 类似,但使用Microsoft提供的会话状态服务器。根本没有使用这种模式,但它是一种选择......(我没有经验)。

  • 定制。您可以实现一些接口/抽象类并定义自己的会话状态存储。

另一方面,会话状态是服务器端,它与cookie无关。这是一种在HTTP规则的无状态世界中模拟状态的方法。由于ASP.NET在浏览器中编写HTTP cookie,因此它也可以将浏览器会话与唯一的服务器会话链接起来。

关于会话状态是否有用......就我而言,我决定完全避免使用“状态”。我宁愿尽可能保持无国籍。我在浏览器中写下了一些HTTP cookie来识别设置,偏好或用户,并且我按照请求做事。

我更喜欢这样,因为良好的缓存机制可以疯狂地优化请求的性能,因为在大多数情况下,您不会直接在商店中访问数据,而是在某些缓存中,这意味着很快的速度!

顺便说一下,会话状态不应该用于存储大对象而是基本值。会话状态不是缓存。例如,会话状态可以是存储诸如当前登录用户或他/她的角色之类的好地方。或他们的个人资料标识谁知道。

应按每个请求查询任何其他数据。

再次说明:在优化环境方面,缓存应该是您的朋友,不要访问数据库或每个请求中的任何内容,从而影响系统性能。