亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

.NET Core - 將帶有 Request-Id 的傳入請求與出站 HTTP 請求掛鉤

.NET Core - 將帶有 Request-Id 的傳入請求與出站 HTTP 請求掛鉤

C#
蝴蝶不菲 2022-01-15 16:53:38
我們正在尋找一種跨多個 API 請求 HOOK a Request-Id(或 a Correlation-Id)的方法,如下圖所示:這個想法是通過我們的日志中的多個 API 使用一個 id 來跟蹤特定請求。我們使用ILogger的是 .NET Core 2.1 開箱即用的標準。到目前為止我們所做的嘗試我們已嘗試Request-Id在請求標頭中使用,該標頭已成功記錄,但我們無法檢索該值以將其添加到隨后對其他 API 的 HTTP 請求中。我們注意到還有一個CorrelationId被記錄的。但是,我們無法弄清楚如何更新它。此外,我們注意到有TraceIdentity可能HttpContextAccessor解決我們的目的。但是,我們不知道如何利用它來解決我們的問題。我們不能使用 Application Insights,而是希望依賴我們自己的日志記錄基礎架構框架。我們在文檔中找不到任何東西。是否有任何開箱即用的解決方案可供我們使用,而無需提出我們自己的定制解決方案?
查看完整描述

3 回答

?
月關寶盒

TA貢獻1772條經驗 獲得超5個贊

我在 Twitter 上向@davidfowl 提出了同樣的問題。他已回復:


不,沒有什么開箱即用的。有一個端到端的應用程序洞察力,但它不是很充實。您可能會考慮跨團隊使用相同的中間件。如果在 3.0 中有一個工作項來解決這個問題https://github.com/aspnet/Hosting/issues/1350


因此,目前看來,定制中間件是唯一的出路。這可能會隨著未來的版本而改變。


更新


我們最終按照@DavidMcEleney 的建議創建了一個自定義中間件。然而,在它之上我們添加了CorrelationId一個AsyncLocal屬性。這有助于我們在CorrelationId需要時訪問代碼中的任何位置。這是代碼獲取/設置CorrelationId:


using System;

using System.Threading;


public static class CorrelationContext

{

    private static readonly AsyncLocal<string> CorrelationId = new AsyncLocal<string>();


    public static void SetCorrelationId(string correlationId)

    {

        if (string.IsNullOrWhiteSpace(correlationId))

        {

            throw new ArgumentException(nameof(correlationId), "Correlation id cannot be null or empty");

        }


        if (!string.IsNullOrWhiteSpace(CorrelationId.Value))

        {

            throw new InvalidOperationException("Correlation id is already set");

        }


        CorrelationId.Value = correlationId;

    }


    public static string GetCorrelationId()

    {

        return CorrelationId.Value;

    }

}

用于 CorrelationMiddleware.cs


public class CorrelationMiddleware

{

    private readonly RequestDelegate _next;


    public CorrelationMiddleware(RequestDelegate next)

    {

        _next = next;

    }


    public async Task Invoke(HttpContext context)

    {

        context.Request.Headers.TryGetValue("Correlation-Id-Header", out var correlationIds);


        var correlationId = correlationIds.FirstOrDefault() ?? Guid.NewGuid().ToString();


        CorrelationContext.SetCorrelationId(correlationId);


        using (LogContext.PushProperty("Correlation-Id", correlationId))

        {

            await _next.Invoke(context);

        }

    }

}

如果我們CorrelationId稍后需要在代碼中的任何地方訪問 in,那么我們只需調用:CorrelationContext.GetCorrelationId();


查看完整回答
反對 回復 2022-01-15
?
有只小跳蛙

TA貢獻1824條經驗 獲得超8個贊

我一直在使用 Serilog 登錄 dotnet core 并一直在使用中間件推送 LogContext 屬性-


相關中間件.cs


    public class CorrelationMiddleware

    {

    readonly RequestDelegate _next;


    public CorrelationMiddleware(RequestDelegate next)

    {

        _next = next;

    }


    public async Task Invoke(HttpContext context)

    {

        context.Request.Headers.TryGetValue(Headers.Correlation, out StringValues correlationId);


        using (LogContext.PushProperty("Correlation-Id", correlationId.FirstOrDefault()))

        {

            await _next.Invoke(context);

        }

    }

}

在您的 Startup.cs 配置方法中注冊它:


app.UseMiddleware<CorrelationLogger>();

然后,在進行出站 http 調用時 - 您可以通過添加向 HttpRequestMessage 添加標頭


request.Headers.Add(Headers.Correlation, GetHeader("Correlation-Id"));

在搜索日志時,我們可以通過相關 ID 進行搜索并查看所有 API 之間的完整端到端...


查看完整回答
反對 回復 2022-01-15
?
Cats萌萌

TA貢獻1805條經驗 獲得超9個贊

不確定,如果這直接相關,但我們在 Service Fabric 項目中跨 api 和服務關聯請求時面臨同樣的問題。我們最終從 CallContext(在 System.Runtime.Remoting.Messaging 內部)設置和獲取了相關性 ID。巧合的是剛剛在這里寫了一些關于它的東西。請看看這是否有幫助。


查看完整回答
反對 回復 2022-01-15
  • 3 回答
  • 0 關注
  • 458 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號