【问题标题】:C# HttpRequestMessage.GetCorrelationId method returns duplicatesC# HttpRequestMessage.GetCorrelationId 方法返回重复项
【发布时间】:2019-02-12 17:22:02
【问题描述】:

我和我的团队已经解决这个问题几天了,我们无法确定 GetCorrelationId() 有时返回重复 GUID 的根本原因。

在我现在工作的应用程序中,我们使用关联 ID 来绑定请求路径。

例如,UI 向 .NET 中的 API 发送保存请求。当API从控制器调用查询服务中的save方法时,会将Request.GetCorrelationId()的结果传递给方法调用。

查询服务中的save方法使用该参数在audit_logs表中插入一个新行,包含请求信息。

save 方法然后在属于主对象的嵌套对象上调用其他保存方法,并传递控制器中生成的相关 ID。

类似的东西

[ Controller ]
var correlation_id = HttpRequestMessage.GetCorrelationId();
{
  ParentObject.save(correlation_id) -> {
    ChildObject1.save(correlation_id),
    ChildObject2.save(correlation_id),
  }
}

我的问题是。这是 GetCorrelationId 如何创建 GUID 对象的问题还是框架的配置有问题?

框架是.NET Framework 4.6.1 我们在 IIS Express 和 IIS 服务器中看到了这个问题

我无法分享代码,但我会尽我所能分享解决此问题所需的尽可能多的信息。

这是重复 GUID 的一些示例

谢谢

【问题讨论】:

    标签: c# asp.net-mvc logging audit-trail


    【解决方案1】:

    好的,我找到了解决方案。我正在发布它,所以如果其他人有同样的问题可以得到这个例子。

    在 Google 上进一步挖掘后,我发现了这篇文章 https://www.codeproject.com/Articles/392926/Grouping-application-traces-using-ActivityId

    Sebastian 正在使用 IIS 生成的 ActivityId 将他的进程中执行的不同命令联系在一起。

    然后我找到了HttpRequestMessageExtensionshttps://github.com/aspnet/AspNetWebStack/blob/master/src/System.Web.Http/HttpRequestMessageExtensions.cs的源码

    在那里,您可以看到 GetCorrelationId() 方法使用 ActivityId 为请求分配关联 ID。

    ActivityId 不是完全随机的。它与 IIS 启动的线程相关联。我注意到我们来自 localhost:port 的所有请求在末尾都有相同的字符串 b63f-84710c7967bb

    我们想绑定所有执行的命令来保存或检索对象。所以我们需要的只是每个请求生成的随机 Guid。按照 Sebastian 发布的示例,我将当前的 ActivityId 存储在 aux 变量中,然后为其分配一个新的 GUID,执行 Request.GetCorrelationId(),最后将存储在 aux 变量中的 ID 分配回 ActivityId。

    在伪代码中 =>

    Guid prevActivityId = Trace.CorrelationManager.ActivityId
    Trace.CorrelationManager.ActivityId = Guid.NewGuid()
    ...
    
    guid correlation_id = Request.GetCorrelationId()
    
    ...
    Trace.CorrelationManager.ActivityId = prevActivityId
    

    希望这对其他人有帮助。

    【讨论】:

    • 我没有选择此答案作为最佳答案,因为据我所知,它仅适用于我们的案例。也许其他一些对如何生成 ActivityId 有更多了解的人可以对此进行扩展。
    猜你喜欢
    • 2014-07-06
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 2019-06-27
    • 2014-04-04
    • 1970-01-01
    相关资源
    最近更新 更多