我正在使用session做两件事:
我看到有时会出现这种情况,但我没有找到一致的问题来追踪。我毫不怀疑这可能是我的代码中需要跟踪的内容,但这让我想起了关于会话的问题......
我担心我会把它转移到现场使用并遇到各种各样的问题。
我只是这样做:
Session["Css"] = css;
以同样的方式阅读:
css = Session["Css"]
更新
我正在使用的会话:
HttpSessionStateBase控制器会话
答案 0 :(得分:4)
会话状态有几种类型。 InProc,StateServer和SqlServer。我相信默认是InProc。您可以在MSDN here和here上了解详情。
其中每个都将遵循web.config文件中定义的sessionState的超时值。对于单个服务器设置(这是我通常所做的),我通常将sessionState设置如下:
<sessionState
mode="StateServer"
stateConnectionString="tcpip=127.0.0.1:42424"
timeout="2880" />
这与Forms Auth的默认超时时间相同,因此只要我的用户授权cookie / session,我的会话就会保持不变。这将要求您将ASP.NET状态服务器上的启动设置为Automatic
。以下是我在解释类型及其潜在缺点时的高级通行证。
每次应用程序池回收Web应用程序的工作进程时,都会重置此项。我相信这就是你发生的事情,这就是为什么你的会话变量在看似随机的时候是空的。
这将在apppool recycleles中保持状态,但要求您启用ASP.NET状态服务器服务,并将其启动类型更改为自动。
如果您有一个处理网站的Web场或多个Web服务器,则可能会遇到问题,除非您运行专用的状态服务器。
这要求存储在会话变量中的变量为[Serializable]
。
这会将会话变量持久保存到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,会话对于在您所描述的示例类型的页面之间为每个用户保存此类数据并不是一种坏方法。