无法获得响应正文以将其记录在应用程序洞察中

问题描述 投票:1回答:1

为了将response body记录到来自HttpContext的app-insights我应该开发一个Middleware,它拦截每个请求和响应并提取HttpContext,在我的情况下Response.Body,然后使用telemetryClient.TrackTrace()将其发送到app-insight。

问题是,当我调试并提取响应的主体时总是为空。

这是我的Middleware课程

public class ResponseBodyInitializer
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    private readonly RequestDelegate _next;

    public ResponseBodyInitializer(IHttpContextAccessor httpContextAccessor, RequestDelegate next)
    {
        _httpContextAccessor = httpContextAccessor;
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        string resBody = await GetResponseBodyForTelemetry(context);
        SendDataToTelemetryLog(resBody, context);

    }

    private static void SendDataToTelemetryLog(string respBody, HttpContext context)
    {
       if (context.Request.Method == "POST" || context.Request.Method =="PUT")
       {
                var telemetryClient = new TelemetryClient();
                var traceTelemetry = new TraceTelemetry
                {
                    Message = respBody,
                    SeverityLevel = SeverityLevel.Information
                };
                //Send a trace message for display in Diagnostic Search. 
                telemetryClient.TrackTrace(traceTelemetry);
        }
     }

    private async Task<string> GetResponseBodyForTelemetry(HttpContext context)
    {
        var originalBody = context.Response.Body;

        try
        {
            using (var memStream = new MemoryStream())
            {
               context.Response.Body = memStream;

               //await the responsebody
                 await _next(context);
                 if (context.Response.StatusCode == 204)
                 {
                     return null;
                 }

                 memStream.Position = 0;
                 var responseBody = new StreamReader(memStream).ReadToEnd();

                 memStream.Position = 0;
                 await memStream.CopyToAsync(originalBody);

                 return responseBody;
             }
         }
         finally
         {
             context.Response.Body = originalBody;
         }
     }
}

StartUp.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
            _loggerFactory = loggerFactory;
            app.UseDefaultFiles()
                .UseStaticFiles()
                .UseMiddleware<ResponseBodyInitializer>()
                .UseBotFramework();

}

或者还有其他方法可以在app-insight中记录响应吗?

c# .net-core middleware azure-application-insights
1个回答
0
投票

以下是您必须执行的步骤: -

1)您必须实现ITelemetryInitializer。

2)将IHttpContextAccessor注入类并读取Initialize方法中的响应流。

3)确保传递的ITelemetry对象来自RequestTelemetry类型,并且HttpRequest是Post或Put。

4)然后,您可以使用IHttpContext.HttpContext.Response.Body属性读取响应,并使用Application Insight进行记录。

最后,在Startup.cs中的ConfigureService方法中注册您的类

我看,你没有实现ITelemetryInitializer,也读取了Initialize方法中的流

尝试这些步骤,看看它是否有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.