1

我正在使用会话做两件事:

  1. 跟踪要为特定公司加载的 css 文件。
  2. 跟踪跟踪我们所在公司的公司 ID 指南。

我看到这有时会以 null 的形式出现,但我没有找到一个一致的问题来追踪。我毫不怀疑这可能是我的代码中需要追踪的东西,但这让我想到了关于会话的问题......

  1. 我是否非常依赖 Session 在屏幕之间传递信息?
  2. 是否一致?
  3. 什么可以在页面加载之间清除它?
  4. 会话是否容易被用户清除?
  5. 我应该使用其他更可靠的东西吗?

我担心我会把它移到现场使用并遇到各种问题。

我只是这样做:

Session["Css"] = css;

并以同样的方式阅读:

css = Session["Css"]

更新

我正在使用的会话:

HttpSessionStateBase 控制器会话

4

2 回答 2

4

会话状态有几种类型。InProc、StateServer 和 SqlServer。我相信默认值是 InProc。您可以在此处此处的 MSDN 上阅读有关此内容的更多信息。

这些中的每一个都将遵守 web.config 文件中定义的 sessionState 的超时值。对于单个服务器设置(这是我通常做的),我的 sessionState 设置通常如下:

<sessionState 
    mode="StateServer" 
    stateConnectionString="tcpip=127.0.0.1:42424" 
    timeout="2880" />

这与 Forms Auth 的默认超时相同,因此只要我的用户验证 cookie/会话,我的会话就会一直存在。这将要求您将 ASP.NET 状态服务器上的启动设置为Automatic. 下面是我解释这些类型及其潜在缺点的高级通行证。

进程内

每次应用程序池回收 Web 应用程序的工作进程时,这将被重置。我相信这就是发生在您身上的事情,这就是为什么您的会话变量在看似随机的时间为空的原因。

状态服务器

这将在 apppool 循环中保持状态,但需要您启用 ASP.NET 状态服务器服务,并将其启动类型更改为自动。

如果您有一个网络农场或多个网络服务器处理该网站,您可能会遇到问题,除非您运行专用的状态服务器。

这要求存储在会话变量中的变量是[Serializable].

SQL服务器

这会将会话变量持久保存到 SQL 数据库,并且通常是网络场情况的最佳方法。

这要求存储在会话变量中的变量是[Serializable].

于 2012-12-28T21:30:18.360 回答
0

您不能按照这些思路编写 GetCss() 方法吗?

GetCss() {

    var css = (CastToYourTypeHere)Session["css"];

    if(css == null) {

        //do whatever you'd normally do here to set the css, 
        //e.g. get the users guid and find their company css, and set css equal to it
        css = myHypotheticalGetCssBasedOnTheUserFunction();

    }

    return css;

}

这样你就可以覆盖所有的基础,你可以愉快地使用 Session,如果它由于某种原因丢失了,你只是重新运行你的初始“getCssForThisUser”类型代码。

IMO,在您描述的示例类型中,会话不是在页面之间为每个用户保存此类数据的好方法。

于 2012-12-28T21:41:04.480 回答