0

我正在使用 .NET 4.0、ASP.NET 和 WCF。这是一个多层网络服务。我想在 Web 层中记录呼叫者 ID,然后在数据层中查询数据库时使用该 ID。

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

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

谢谢

4

3 回答 3

0

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

HttpContext.Current.User.Identity

但是让 BL 或 DAL 知道HttpContext并不是最好的主意,您不想将自定义 UI 代码嵌入到通用 BL 和 DA 层中。通常的流程是您在 UI 中创建一个用户(基于HttpContext),用户有一些方法和属性(位于 BL 中)。一个属性是 ID,方法可以使用此 ID。有些人喜欢将逻辑分离到单独的服务中——这些服务应该考虑到他们需要操作的所有信息。服务应获取用户或用户 ID(如果您的情况需要)。

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

于 2012-09-17T23:00:55.530 回答
0

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

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

于 2012-09-17T22:43:47.710 回答
0

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

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

HttpSessionState.SessionID 属性

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

于 2012-09-17T23:20:49.483 回答