2014-11-08 117 views
0

我已经四处寻找有关此问题的提示,但是我看到的所有内容都是针对Web应用程序的,但我正在制作一个常规的ASP.NET Web表单网站。请随身携带,我是.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> 

所以我这样做,但随后产生的错误说:“分析器错误信息:这是使用注册的节是错误的as allowDefinition ='MachineToApplication'超出了应用程序级别。此错误可能是由于虚拟目录没有被配置为IIS中的应用程序。“

我不知道还有什么可以尝试的。我创建的网站位于我的域的子目录中,我编辑的web.config和global.asax文件位于该子目录中,所以我不认为其他地方存在冲突吗?

我一直坚持这一段时间,任何帮助非常感谢。

回答

0

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

其他因素虽然可以是应用程序池已回收出于某种原因。有时候是由于错误,但也适用于其他事件,例如连接池中的数据库连接用尽,以及最着名的问题,它只是在会话中存储太多项目,导致应用程序池耗尽内存并回收。

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

首先将子目录设置为IIS中的应用程序,然后查看其行为。之后,如果问题仍然存在,就会开始寻找其他问题,例如内存泄漏。您不希望将会话延长太久。如果用户停止超过20或30分钟的任何事情,他们很可能不会很快回来。由于会话消耗内存,缩短时间有助于应用程序的性能。如果您需要更长时间的存储空间,那么性能通常会更好,并且应用程序的稳定性也可以使用用于数据库等较长期数据的存储。

+0

谢谢马克,我会试试。由于我刚接触.Net,因此我不认为必须将子目录设置为IIS中的应用程序,因为它是一个Web表单网站而不是应用程序。我会给这个镜头 – Cineno28 2014-11-08 13:31:28

+0

IIS中的应用程序更像是一个操作区或一个独立的实体。这意味着它内部的任何东西都可以在它自己的内存空间中运行您必须小心,因为任何应用程序通常都会默认继承根应用程序的属性,但您可以在自己的应用程序范围内重载它们。 – 2014-11-08 15:54:48

+0

很高兴知道,谢谢!这可能听起来像一个愚蠢的问题,但我对.net开发很陌生。我已经分配到的网站使用Windows托管,并在根目录下有一个php站点。他们现在在一个子目录中有一个asp.net站点,并要求我在另一个子目录中创建这个额外的.net站点。是在根源的PHP网站会导致冲突?我不知道他们为什么这样设置它。我将按照你的指示将这个目录设置为一个应用程序,但是我想问问这是否可能导致另一个问题 – Cineno28 2014-11-08 16:26:18