如何阻止结构图从会话返回不正确的对象?

时间:2019-04-03 08:16:49

标签: c# asp.net vb.net structuremap

有时结构图似乎返回了不正确的对象,当托管我们的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服务器上拥有以前版本的代码,可以正常工作。该网站的最新版本上周开始展示这种奇怪的缓存行为。最近发生的显着变化是:

  1. 运行该站点的应用程序池现在为64位

  2. 已经安装了新的kemp负载均衡器。

我们已经看过的东西:

  1. What is the difference between HybridHttpOrThreadLocalScoped & HttpContextScoped(我们没有对线程做任何事情,因此我们认为这很好)

  2. Difference between Session and HttpContext.Current.Session(我们在GetDatabaseInfoFromSession中执行了空检查,而我们的旧代码没有抛出HttpException)

如果在启用64位的情况下加载了结构图,结构图是否会在计算机级别开始缓存?或者结构图与活动会话混淆?

0 个答案:

没有答案