Не удалось получить тело ответа для регистрации в приложении - PullRequest
1 голос
/ 03 апреля 2019

Чтобы зарегистрировать response body в app-insights от HttpContext, я должен разработать Middleware, который перехватывает каждый запрос и ответ и извлекает HttpContext, в моем случае Response.Body, а затем отправляет его в app-insights, используя telemetryClient.TrackTrace().

Проблема в том, что при отладке и извлечении тело респона всегда пусто.

Это мой 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-insights?

1 Ответ

0 голосов
/ 04 апреля 2019

Вот шаги, которые вы должны сделать: -

1) Вы должны реализовать ITelemetryInitializer.

2) Вставить IHttpContextAccessor в класс и прочитать поток ответа в пределахМетод Initialize.

3) Убедитесь, что переданный объект ITelemetry принадлежит к типу RequestTelemetry и что HttpRequest был либо Post, либо Put.

4) Затем вы можете прочитать ответ, используя IHttpContext.HttpContext.Свойство .Response.Body и зарегистрируйте его с помощью Application Insight.

Наконец, зарегистрируйте свой класс в методе ConfigureService в вашем Startup.cs

Я вижу, вы не реализуете ITelemetryInitializer, также прочитайтеПоток в методе Initialize

Попробуйте эти шаги и посмотрите, поможет ли это.

...