使用ASP.NET会话状态时有哪些常见问题和最佳实践?

时间:2008-11-16 12:45:58

标签: asp.net session

例如,我在我的ASP.NET应用程序中广泛使用了该会话,但是在某个地方可以听到存储在会话中的对象可以被服务器内存不足的系统删除。这是真的?是否有任何会话'回调'功能允许您重新填充清除对象?

更一般地说,使用会话状态的其他潜在问题是什么,以及处理它们的建议最佳实践是什么?

3 个答案:

答案 0 :(得分:2)

无论您使用哪种预防措施,始终假设您的会话可能会消失并仔细检查:

Dim sessionObj As Object = CType(Session("SessionKey"), Object)
If sessionObj Is Nothing
    sessionObj = ReCreateObj()
    Session("SessionKey") = sessionObj
End If

object sessionObj = Session["SessionKey"] as object ;
if(sessionObj == null)
{
    sessionObj = ReCreateObj();
    Session["SessionKey"] = sessionObj;
}

会话包装器适用于此,因此您无法在访问会话变量的任何位置进行检查。

我和custom Session-State Providers好运。一些有用的调整包括:

  • 使用数据库支持的会话时,在请求开始时获取所有会话变量,并将它们全部存储在最后,而不是每个访问/存储每个集。如果您使用多个会话变量,因为它减少了到外部服务器的往返次数,这非常有用。
  • 实施两步内存/数据库存储。在保存时,将var存储在本地服务器上并保存到数据库中。访问时,首先检查内存(如果在此处找到,则保存网络跃点),然后检查数据库。

在实施您必须支持的内容之前,我肯定会看到三个standard Session modes中的一个是否正常工作。一旦您了解了应用程序的古怪需求,自定义会话就非常有用。

答案 1 :(得分:1)

很抱歉,我不知道从会话状态中删除项目,但是为了回答您的一般问题,最重要的问题是您是否预计只在一台Web服务器计算机上运行您的Web应用程序,或者很多。

通常,您将会话状态保留在一台计算机的内存中。您的多个Web服务器前端的负载均衡器必须配置为“粘滞”,以便同一用户继续路由到同一台计算机。

或者,您可以将会话状态存储在一个中心位置,包括SQL Server,但是您可以为网络和IO与SQL Server的交互支付性能。你放弃了处于记忆状态的本地速度。

由于会话状态默认为20分钟,如果您需要更多,但您的托管公司不允许您覆盖它,则必须在您的网页中运行一些ajax或隐藏的iframe javascript代码每隔(少于)20分钟ping服务器以保持会话

答案 2 :(得分:1)

每次重新启动应用程序池时,例如,创建一个设置会话变量并在页面中显示它的页面,现在,更新BIN,APPCode,Global或Local Resources文件夹,您将看到会议将被删除。

在共享主机环境中,由于你覆盖了什么Session.Timeout值,它们会更加棘手,因为它们会阻止会话超时到正常的20分钟。

由于这个以及更多的原因我使用SQL Sessions,Web应用程序有点慢,因为所有(会话)都在SQL Server而不是内存中,但是您可以对它进行更多控制,并且可以设置会话超时到任何你想要的!在我的情况下非常好,因为我希望他们在我更新应用程序时继续工作(非常糟糕,每次我更新APP Code文件夹时,所有用户都会松开他们正在工作的东西并且必须再次登录)并且我想要将共享主机扩展20分钟到45分钟。

详细了解SQL Session State

相关问题