HttpContext.TraceIdentifier 始终相同(和 Guid)

Cow*_*org 1 serilog asp.net-core

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

经过一番谷歌搜索后,我发现 Serilog 用于HttpContext.TraceIdentifier此目的,它应该看起来像“0HL0GJPLR7AOD”。

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

这也是在 serilog 中显示为“RequestId”的内容,但我的主要问题是为什么不是HttpContext.TraceIdentifier“某些文本”格式以及为什么每个请求都相同?

Mat*_*att 7

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

以下是按上述方式运行时的功能示例:

在红隼上运行

如果您使用 IIS/Express 运行,您将看到一个 GUID,并且在我的测试中,每个请求它都是唯一的...以下是 IIS Express 上的相同示例:

在 IIS Express 上运行

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

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

    public void OnGet()
    {
        RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
    }
}
Run Code Online (Sandbox Code Playgroud)