非常不寻常的ASP.net会话变量持久性

时间:2011-10-13 16:11:10

标签: asp.net session-state

我有一个非常奇怪的ASP.net间歇性会话持久性问题。首先是一些事实:

环境:

  • 启用了粘性会话的F5 Load Balancer:
  • 网络服务器:2 * Windows Server 2008 R2,
  • .net Framework版本:2.0.50727,IIS7,
  • 数据库服务器:SQL Server 2008 R2
  • 会话协议:ASP.net InProc会话,超时设置为20分钟,cookieless = false
  • CMS:Ektron CMS 400.net

确定问题。

我们有一些自定义的VB.net会话值,可以在我们的网站上设置购物车。有时这些变量似乎失去了持久性。我说一些,因为主要会议仍然持久。我认为主要的罪魁祸首是这个人:

Shared Sub New()
    ' If the cart is not in the session, create one and put it there
    ' Otherwise, get it from the session
    If HttpContext.Current.Session("ASPNETShoppingCart") Is Nothing Then
        Instance = New ShoppingCart()
        Instance.Items = New List(Of CartItem)
        HttpContext.Current.Session("ASPNETShoppingCart") = Instance
    Else
        Instance = CType(HttpContext.Current.Session("ASPNETShoppingCart"), ShoppingCart)
    End If

End Sub

即使此会话对象保持持久性,当我运行跟踪时它也不会显示:

e.g。

我的其他会话变量如Session(“userId”)出现在跟踪中,而我从未看到Session的值(“ASPNETShoppingCart”) - 我认为这很奇怪 - 也许这是因为它是一个对象而不是一个字符串?

我已经排除了负载均衡器的问题,直接绕过它并直接在服务器上调用代码。

我知道问题发生后整个会话没有被销毁,因为我仍然登录并且其他会话值出现在屏幕上 - 但我的购物车价值却没有。

有没有人知道可能导致这样的事情?是否有任何保护会话变量的方法,或者至少在更改状态时被通知,以便我可以追踪导致此问题的原因?

1 个答案:

答案 0 :(得分:1)

实际上,奇怪的是“某些”变量会丢失而有些则不会丢失。

也许您有某种“后备”机制可以重新创建“UserID”(例如,来自身份验证cookie),而其他对象也不会这样做。

一般情况下,我会不惜一切代价避免使用InProc会话状态,因为每当asp.net工作进程被循环使用 - 这可能随时发生 - 会话中的所有内容都将丢失。由于您使用粘性会话,我的建议是您使用本地OutOfProcess切换到StateServer模式。您可以阅读more here.配置非常简单;只需更改Web.config并确保在服务器上启动ASP.NET状态服务。

唯一需要注意的是,您的所有对象都需要是Serializable,但如果您没有在Session中存储异国情调,那么您需要做的就是使用[Serializable]属性来装饰您的对象。