有时结构图似乎返回了不正确的对象,当托管我们的Web应用程序的给定Web服务器负载沉重时,似乎会发生这种情况。有问题的对象是我们自己的类,其中包含服务器和数据库名称的属性,这些属性用于构建连接字符串。
我们的Web应用程序包含两部分,一个是ASPX Web表单部分,该部分大量使用会话,另一个是MVC中的新部分,该部分位于Web表单项目的区域内。这两个区域共享同一会话。数据库连接信息在登录时建立,并存储在会话中。 Web表单区域直接从会话中获取数据库信息,并且运行良好。
Dim dbInfo as DbInfo = me.Session("dbInfo")
MVC区域通过结构映射获取数据库信息注入,而结构映射又从会话获取对象。
Public Class WebRegistry
Inherits Registry
Public Sub New()
[For](Of IDbInfo)().HybridHttpOrThreadLocalScoped().Use(Function() GetDatabaseInfoFromSession())
End Sub
<CLSCompliant(False)>
Public Shared Function GetDatabaseInfoFromSession() As IDbInfo
If HttpContext.Current.Session("dbInfo") IsNot Nothing Then
Return HttpContext.Current.Session("dbInfo")
End If
Return Nothing
End Function
End Class
如您在上面的代码中看到的那样,两者都在会话中访问相同的变量,并且似乎大多数时候都返回相同的值。但是似乎发生了一些缓存,因为问题是旧代码使用的是正确的连接(用户已登录的连接),而结构映射方法似乎正在缓存另一个数据库连接。
我们模仿相同行为的方法是手动将函数GetDatabaseInfoFromSession中的dbInfo实例化到另一个数据库。
请注意,此代码已投入生产一年以上,并且我们在同一台Web服务器上拥有以前版本的代码,可以正常工作。该网站的最新版本上周开始展示这种奇怪的缓存行为。最近发生的显着变化是:
运行该站点的应用程序池现在为64位
已经安装了新的kemp负载均衡器。
我们已经看过的东西:
What is the difference between HybridHttpOrThreadLocalScoped & HttpContextScoped(我们没有对线程做任何事情,因此我们认为这很好)
Difference between Session and HttpContext.Current.Session(我们在GetDatabaseInfoFromSession中执行了空检查,而我们的旧代码没有抛出HttpException)
如果在启用64位的情况下加载了结构图,结构图是否会在计算机级别开始缓存?或者结构图与活动会话混淆?