2

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

我已经创建了一个数据库驱动的站点,目前正在开发另一个站点,并且一段时间以来,我一直在 Session 变量随机变为 null 并引发错误方面遇到一些麻烦。如此之多,一个简单的 Session 变量改为使用服务器缓存内存进行切换(我最初认为它会更不稳定,但到目前为止还有待观察......)

一个问题是:Session 变量有什么实际用途吗?如果它真的像看起来那样不稳定,那么它们似乎一无所获。\

我知道它们在技术上是 cookie,所以我知道不应该依赖它们的数据,但这就是问题所在。我需要将数据发送到我“可以”依赖的其他页面。这忽略了 Session 变量和 cookie。

我通常远离查询字符串或 url 数据,因为它们公然“纯文本”显示任何敏感信息(如社会安全号码),即使 SSL 也无济于事。

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

AppState 变量不是用户特定的。

这留下了隐藏的输入字段......这里的问题是,有时在“发布”之后我会执行 Response.Redirect 等,因此 C# 并不总是在发布后呈现页面(似乎)。

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

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

4

1 回答 1

2

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

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

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

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

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

另一方面,会话状态是服务器端的,它与 cookie 无关。这是在 HTTP 统治的无状态世界中模拟状态的一种方式。由于 ASP.NET 在浏览器中写入 HTTP cookie,它也可以将浏览器会话与唯一的服务器会话链接。

关于会话状态是否有用......在我的情况下,我决定完全避免“状态”。我更喜欢尽可能地保持无国籍状态。我在浏览器中写下一些 HTTP cookie 来标识设置、偏好或用户,并根据请求执行操作。

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

顺便说一句,会话状态不应该用于存储大对象,而是用于存储基本值。会话状态不是缓存。例如,会话状态可能是存储当前登录用户或其角色等内容的好地方。或他们的个人资料标识符。谁知道。

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

再说一遍:缓存在优化环境方面应该是您的朋友,并且不要在每个请求中访问数据库或其他任何内容,从而损害系统性能。

于 2012-12-12T15:55:09.393 回答