如何将传出 HttpClient 请求正文记录到 Application Insights 依赖项表中?

You*_*uxu 5 azure azure-application-insights asp.net-core

我有一个 .Net core Web App API,它接受来自前端的请求,然后将 HTTP POST 请求发送到 Azure 搜索以获取搜索结果。

我只是使用内置应用程序洞察记录请求和依赖项源中的基本信息,并且具有零日志记录代码。

现在,我想扩展默认的 Application Insights 依赖项表以将请求正文添加到 Azure 搜索。

用最少的代码最简单的方法是什么?

小智 0

根据您的要求,您可以尝试以下代码:

public class RequestBodyInitializer : ITelemetryInitializer
{
    readonly IHttpContextAccessor httpContextAccessor;

public RequestBodyInitializer(IHttpContextAccessor httpContextAccessor)
{
    this.httpContextAccessor = httpContextAccessor;
}

public void Initialize(ITelemetry telemetry)
{
    if (telemetry is RequestTelemetry requestTelemetry)
    {
        if ((httpContextAccessor.HttpContext.Request.Method == HttpMethods.Post ||
             httpContextAccessor.HttpContext.Request.Method == HttpMethods.Put) &&
            httpContextAccessor.HttpContext.Request.Body.CanRead)
        {
            const string jsonBody = "JsonBody";

            if (requestTelemetry.Properties.ContainsKey(jsonBody))
            {
                return;
            }

            //Allows re-usage of the stream
            httpContextAccessor.HttpContext.Request.EnableRewind();

            var stream = new StreamReader(httpContextAccessor.HttpContext.Request.Body);
            var body = stream.ReadToEnd();

            //Reset the stream so data is not lost
            httpContextAccessor.HttpContext.Request.Body.Position = 0;
            requestTelemetry.Properties.Add(jsonBody, body);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并将其添加到“启动”>“配置服务”

services.AddSingleton<ITelemetryInitializer, RequestBodyInitializer>();
Run Code Online (Sandbox Code Playgroud)