会话变量在会话到期之前丢失

时间:2014-11-08 04:29:59

标签: asp.net

用户登录后,我将Session变量设置为存储其ID。此ID用于加载用户名等内容。该名称将首先正确显示,表明使用了Session变量。但是,如果我在几分钟后刷新页面,则用户名为空,表示Session变量现已消失。

我已经读过默认的会话超时是20分钟。我在托管服务提供商的Asp.net设置中确认了这一点。但变量在20分钟之前就已经丢失了。

我还读到我应该有一个带有以下代码的Global.asax文件:

void Session_Start(object sender, EventArgs e) 
{
Session.Timeout = 20;
}

我做到了,但几分钟后我仍然失去了这个变量。然后我读到我应该将下面的代码放在我的web.config中:

<configuration>
   <system.web>
      <sessionState mode="InProc" timeout="120" />
   </system.web>
</configuration>

所以我这样做了,但是它产生了一个错误:&#34; Parser错误消息:使用注册为allowDefinition =&#39; MachineToApplication&#39;的部分是错误的。超出应用水平。此错误可能是由于虚拟目录未在IIS中配置为应用程序引起的。&#34;

我不确定还有什么可以尝试的。我创建的网站位于我的域的子目录中,我编辑的web.config和global.asax文件位于该子目录中,因此我不认为存在冲突别的对吗?

1 个答案:

答案 0 :(得分:0)

您的子目录未在IIS中标记为应用程序。由于您尚未正确创建应用程序,因此这可能是问题的一部分。由于它未标记为应用程序,因此web.config的某些功能是非法的,因为它们只能放在应用程序的根目录中。

其他因素可能是应用程序池由于某种原因而被回收。有时由于错误,但也会对其他事件(例如连接池中的数据库连接耗尽)以及最着名的只是在会话中存储太多项目导致应用程序池耗尽内存和回收。

由于您的应用程序位于子目录中,因此它实际上是另一个应用程序的一部分。在这种情况下,主应用程序发生的任何事情都可能是干扰或放弃会话。根web.config可能具有非常不同的会话状态设置,这可能使行为非常不同。

首先将子目录设置为IIS中的应用程序,然后查看它的行为方式。之后,如果问题仍然存在,则开始寻找其他问题,例如内存泄漏。您不希望会话延长太长时间。如果用户停止做任何事情超过20或30分钟,他们很可能很快就会回来。由于会话占用内存,因此较短的时间有助于应用程序的性能。如果您需要更长时间的存储,通常会更好地提高性能以及应用程序的稳定性,以便为长期数据(如数据库)使用商店。