我有Webform ASP.NET 4.5应用程序。
在登录页面中,Session变量设置为:(简化相关代码)
Session["UserName"] = txtUserName.Text; (txtUserName.Text cannot be empty)
然后
Response.Redirect("Survey.aspx");
在调查页面中我有
if (Session == null || Session["UserName"] == null)
{
string errorText = "Session was timed out due to inactivity, to continue, please close All of your Browser windows and log in again";
在web.config文件中我有:
<system.web>
<sessionState mode="InProc" timeout="1200" />
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
<customErrors mode="Off"> </customErrors>
</system.web>
同样在IIS本身上我有
超时:02:00:00
仍有用户在15-20分钟后间歇性地报告会话超时。
这导致了什么?
=============================
更新:将其设置为stateserver后我得到:
Unable to make the session state request to the session state server. Please ensure that the ASP.NET State service is started and that the client and server ports are the same. If the server is on a remote machine, please ensure that it accepts remote requests by checking the value of HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\AllowRemoteConnection. If the server is on the local machine, and if the before mentioned registry value does not exist or is set to 0, then the state server connection string must use either 'localhost' or '127.0.0.1' as the server name.
答案 0 :(得分:2)
如评论中所述,您的应用程序池可能配置为定期回收,这将导致InProc会话丢失。
您还在评论中提问:
您建议更改应用程序池或&lt; sessionState mode =&#34; StateServer&#34;&gt; ?
一般来说,我都不会这样做!相反,我会设计应用程序,使其对会话数据丢失具有弹性。
在您的示例中,您在Session中存储用户名。相反,我会使用表单身份验证,在这种情况下,HttpContext.Current.User.Identity.Name
可以使用用户名:无需将其存储在Session中。
一般情况下,我只会在Session中存储可以轻松重新生成的内容,例如通过从数据库中读取。要从Session中检索内容,请检查null并在必要时重新生成,例如:
var mySessionValue = (MyType) Session["MyKey"];
if (mySessionValue == null)
{
mySessionValue = ... regenerate value, e.g. by reading from database
Session["MyKey"] = mySessionValue;
}
...
答案 1 :(得分:1)
您可能正在丢失会话状态,因为应用程序池正在被回收。应用程序池可能被回收的原因有多种,包括超时,异常等。
如果您将会话状态从InProc
更改为StateServer
,那么您的会话信息应该在应用程序池被回收后继续存在。
使用StateServer
有一些缺点 - 主要的一点是添加到会话中的对象必须是可序列化的。这通常不是一个大问题。
要使StateServer
正常工作,您需要确保已安装ASP.NET State Server
且服务正在运行。