HttpContext.TraceIdentifier 总是相同的(和一个 Guid)

HttpContext.TraceIdentifier is always same (and a Guid)

我正在为我的 .NET Core webapi 设置日志记录,并希望为一个请求提供唯一的 ID。

经过一些谷歌搜索后,我发现 Serilog 使用 HttpContext.TraceIdentifier 来达到这个目的,它看起来应该类似于“0HL0GJPLR7AOD”。

如果我在控制器方法中设置断点,我会得到 HttpContext.TraceIdentifier 作为 Guid,更糟糕的是,它每次都一样,而不是每个请求一个 (800000ad-0002-fb00-b63f- 84710c7967bb).

这也是在 serilog 中显示为 "RequestId" 的内容,但我的主要问题是为什么 HttpContext.TraceIdentifier 不在格式 "some text" 上,为什么每个请求都一样?

这可能取决于您托管应用程序的位置,跟踪标识符最终来自托管平台的一项功能。如果您 运行 您在 Kestrel 中的应用,例如通过使用默认配置文件(通常与您的项目命名相同),您将看到 ConnectionID:Count 的格式(参见 )。

下面是 运行 如上所述时的功能示例:

如果你 运行 使用 IIS/Express 你会看到一个 GUID,在我的测试中它是每个请求唯一的...这是 IIS Express 上的相同示例:

顺便说一句,您可以自己设置 TraceIdentifier and/or 您可能还想查看 Activity class。这通常优先于 TraceIdentifier,例如在默认错误页面中:

public class ErrorModel : PageModel
{
    public string RequestId { get; set; }

    public void OnGet()
    {
        RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
    }
}