在线程之间保持上下文变量

时间:2012-09-17 22:39:24

标签: asp.net .net wcf

我正在使用.NET 4.0,ASP.NET& WCF。这是一个多层Web服务。我想在Web层中记录调用者ID,然后在查询数据层中的数据库时使用该id。

问题是该应用程序在Web和数据层之间使用多线程(通过.NET任务库实现)业务层。有很多方法,所以我想避免将调用者ID作为参数传递给业务层中的每个函数,然后传递给数据层中的每个函数。

有没有办法在“调用”上下文中保留值?我想到了HttpContext和OperationContext,但据我所知,当线程切换时,它们不会保持状态。

由于

3 个答案:

答案 0 :(得分:0)

你是正确的,因为HttpContext和OperationContext在每个线程的基础上有所不同(它们使用线程本地存储,这就是原因)。

但我看到的解决方案很简单,只需使用您控制的静态类,并且该类将包含一个可公开访问的字典以进行值查找。

答案 1 :(得分:0)

如果使用默认的ASP.NET身份验证,则应该能够从

中检索身份
HttpContext.Current.User.Identity

但让BL或DAL意识到HttpContext不是最好的主意,您不希望将自定义UI代码嵌入到通用BL和DA层中。通常的流程是您在UI中创建用户(基于HttpContext),用户有一些方法和属性(位于BL中)。一个属性是ID,方法可以使用此ID。有些人更喜欢将逻辑分成单独的服务 - 这些服务应该包含他们运行所需的所有信息。服务应获得用户或userId(如果您的情况需要)。

如果以这种方式设计应用程序,那么多线程应用程序将正常工作。每个线程都有一个用户的本地副本。 Context switch将加载一个线程需要的所有数据,因为没有共享资源,每个线程都有自己的用户。

答案 2 :(得分:0)

如果您正在使用身份验证,请使用Oleskii的答案。

如果不使用身份验证,您只想跟踪会话

HttpSessionState.SessionID Property

我认为所有线程都会看到相同的值。