我应该如何依赖Session

时间:2012-12-28 21:25:02

标签: c# asp.net-mvc razor

我正在使用session做两件事:

  1. 跟踪要为特定公司加载的css文件。
  2. 跟踪跟踪我们所在公司的公司ID Guid。
  3. 我看到有时会出现这种情况,但我没有找到一致的问题来追踪。我毫不怀疑这可能是我的代码中需要跟踪的内容,但这让我想起了关于会话的问题......

    1. 我是否依靠Session来在屏幕之间传递信息?
    2. 一致吗?
    3. 在页面加载之间可以清除什么?
    4. 用户是否可以轻松清除会话?
    5. 我应该使用其他更可靠的东西吗?
    6. 我担心我会把它转移到现场使用并遇到各种各样的问题。

      我只是这样做:

      Session["Css"] = css;
      

      以同样的方式阅读:

      css = Session["Css"]
      

      更新

      我正在使用的会话:

      HttpSessionStateBase控制器会话

2 个答案:

答案 0 :(得分:4)

会话状态有几种类型。 InProc,StateServer和SqlServer。我相信默认是InProc。您可以在MSDN herehere上了解详情。

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

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

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

是InProc

每次应用程序池回收Web应用程序的工作进程时,都会重置此项。我相信这就是你发生的事情,这就是为什么你的会话变量在看似随机的时候是空的。

的StateServer

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

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

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

SQLServer的

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

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

答案 1 :(得分: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,会话对于在您所描述的示例类型的页面之间为每个用户保存此类数据并不是一种坏方法。