我有一个非常奇怪的ASP.net间歇性会话持久性问题。首先,一些事实:非常不寻常的ASP.net会话变量持久性
环境:
- F5与粘性会话负载均衡启用:
- 的Web服务器:2 * 的Windows Server 2008 R2,
- .NET Framework版本:2.0.50727, IIS7,
- 数据库服务器:SQL Server 2008 R2的
- 会话协议:ASP.net是InProc会话超时设置为20分钟,无cookie =假
- CMS: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
即使这个会话对象仍然是持久的,它并没有显示出来,当我运行跟踪:
例如
我的其他会话变量如Session(“userId”)显示在跟踪中,而我从来没有看到Session的值(“ASPNETShoppingCart”) - 我认为这很奇怪 - 也许这是因为它是一个对象,到一个字符串?
我直接绕过它并直接调用的代码在服务器上排除了与负载均衡的问题。
我知道什么时候发生的问题,因为我仍然登录等会话值出现在屏幕上完整的会话不被破坏 - 但我的购物车值没有。
有没有人有任何想法可能会导致这样的事情?有没有办法保护一个会话变量,或者至少在它改变状态时被通知,这样我可以跟踪是什么造成了这种情况?
嗨伊卡洛斯,感谢您的反馈。我确实已经考虑将我的协议切换到OutofProcess并将它们存储在数据库中 - 但是在我采用那个'核'选项之前,我希望能够明确为什么只有这个会话对象正在失去持久性。奇怪的是,我无法在生产服务器的另一个镜像上重新创建它。相同的代码,相同的数据库等,所以我认为这是一些像IIS设置的环境变量,干扰会话的Windows服务,一些防病毒或防火墙差异(你明白了!) –
好,你有一面镜子生产,但您也需要能够重现与生产环境相同的负载条件。我希望你在生产服务器上没有防病毒软件。我会非常生气,会有人这样做。 – Icarus
所以我会 - 我自己不控制主生产环境的系统管理元素,所以我不能排除任何东西! –