我正在使用.NET 4.0,ASP.NET& WCF。这是一个多层Web服务。我想在Web层中记录调用者ID,然后在查询数据层中的数据库时使用该id。
问题是该应用程序在Web和数据层之间使用多线程(通过.NET任务库实现)业务层。有很多方法,所以我想避免将调用者ID作为参数传递给业务层中的每个函数,然后传递给数据层中的每个函数。
有没有办法在“调用”上下文中保留值?我想到了HttpContext和OperationContext,但据我所知,当线程切换时,它们不会保持状态。
由于
答案 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)