4

因此,我们使用具有相关 ID 的通用状态上下文单例来进行集中式日志记录。目的是在整个过程中跟踪 id 并关联不同的层。

状态上下文由多个 dll 和多个用户访问。

当多线程发挥作用时,困难就来了:

  1. 进程 1 已被用户 1 解雇
  2. 相关 ID 设置为 {1}
  3. DLL A 访问状态上下文并获取相关 ID {1}
  4. 在进程 1 完成之前,进程 2 已被用户 2 解雇
  5. 相关 ID 设置为 {2}
  6. DLL B 来自第一个进程访问状态上下文,关联 ID 为 {2},它应该是 {1}

我们如何解决这个问题?

我们不认为锁定是我们的解决方案吗?还有其他想法吗?

这是一个图表

        (S)->[  CorrelationID {get;set}  ]                  
               ^           ^            ^
    U1 <-->    |           |            |                 O  
    U2 <--> [DLLA] <-->  [DLLB] <-->  [DLLC]       <-->  | |
    U3 <-->         
            {Web}  <--> {Domain} <-> {Data Access} <--> {DB}

    (<--                 Process / Thread           -->    )  

{} = 可能的 DLL 示例

每个用户的进程应该有 1 个相关 ID

4

2 回答 2

0

可能是 ThreadLocal<T>? https://msdn.microsoft.com/en-us/library/dd642243%28v=vs.100%29.aspx

于 2015-09-28T20:48:04.743 回答
0

经过大量研究,我们找到了解决方案。

我们利用.Net Framework 中的LogicalCallContext 类

因此,LogicalCalContext 类所做的是它利用 .Net 框架,它通过保留回调将键值保留在池中,即使它跳转线程也是如此。

了解如何跨线程传输数据...

将所有 NLog 日志绑定回 WebAPI 中的原始请求的方法

帖子中的评论也引用了Serilog,因此您可能想看一下。

于 2015-09-29T21:52:26.980 回答