2011-10-13 49 views
0

我有一个非常奇怪的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”) - 我认为这很奇怪 - 也许这是因为它是一个对象,到一个字符串?

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

我知道什么时候发生的问题,因为我仍然登录等会话值出现在屏幕上完整的会话不被破坏 - 但我的购物车值没有。

有没有人有任何想法可能会导致这样的事情?有没有办法保护一个会话变量,或者至少在它改变状态时被通知,这样我可以跟踪是什么造成了这种情况?

回答

1

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

也许你有某种形式的,再现了“用户名”(从身份验证cookie,例如)“回退”机制,同样不发生其他对象。

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

唯一需要注意的是,所有对象都需要可序列化,但如果您在Session中没有存储异国情调,则只需使用[Serializable]属性装饰对象。

+0

嗨伊卡洛斯,感谢您的反馈。我确实已经考虑将我的协议切换到OutofProcess并将它们存储在数据库中 - 但是在我采用那个'核'选项之前,我希望能够明确为什么只有这个会话对象正在失去持久性。奇怪的是,我无法在生产服务器的另一个镜像上重新创建它。相同的代码,相同的数据库等,所以我认为这是一些像IIS设置的环境变量,干扰会话的Windows服务,一些防病毒或防火墙差异(你明白了!) –

+0

好,你有一面镜子生产,但您也需要能够重现与生产环境相同的负载条件。我希望你在生产服务器上没有防病毒软件。我会非常生气,会有人这样做。 – Icarus

+0

所以我会 - 我自己不控制主生产环境的系统管理元素,所以我不能排除任何东西! –