在 Application Insights 中查看请求的响应正文

是否可以在 Application Insights 中查看请求的响应正文?我看过很多关于请求正文的问题/文章,但没有发现关于响应正文的指导。

我正在构建一个 MVC 核心 2.1 Web Api。

这是我的代码,从流创建读取器时出现异常,即“流不可读”。.


public class ResponseBodyInitializer : ITelemetryInitializer

{

    readonly IHttpContextAccessor httpContextAccessor;


    public ResponseBodyInitializer(IHttpContextAccessor httpContextAccessor)

    {

        this.httpContextAccessor = httpContextAccessor;

    }


    public void Initialize(ITelemetry telemetry)

    {

        if (telemetry is RequestTelemetry requestTelemetry)

        {

            HttpContext httpContext = httpContextAccessor.HttpContext;

            HttpRequest request = httpContext.Request;

            HttpResponse response = httpContext.Response;


            if (request.Method == HttpMethods.Post || 

                 request.Method == HttpMethods.Put)

            {

                //Log the response body

                if (httpContext.Response.HasStarted)

                {

                    const string responseBody = "ResponseBody";


                    if (requestTelemetry.Properties.ContainsKey(responseBody))

                    {

                        return;

                    }


                    try

                    {

                        var stream = new StreamReader(response.Body);

                        var body = stream.ReadToEnd();                            

                        response.Body.Position = 0;

                        requestTelemetry.Properties.Add(responseBody, body);

                    }

                    catch (Exception ex)

                    {

                        throw ex;

                    }

                }

            }

        }

    }

}  


拉莫斯之舞
浏览 209回答 3
3回答

慕工程0101907

你必须实施ITelemetryInitializer. 将 注入IHttpContextAccessor到类中并读取Initialize方法内的响应流。确保传递的ITelemetry对象来自类型RequestTelemetry并且 HttpRequest 是 Post 或 Put。然后,您可以使用该IHttpContext.HttpContext.Response.Body属性读取响应并使用 Application Insight 将其记录下来。最后,在 Startup.cs 的 ConfigureService 方法中注册您的类

慕丝7291255

我通过添加一个中间件来解决这个问题,该中间件将请求正文保存为HttpContext. app.UseMvc()由于 Mvc 框架处理流,因此之前注册中间件很重要。启动文件public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory){&nbsp; &nbsp; app.Use(async (httpContext, next) =>&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var request = httpContext.Request;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (request.Method == HttpMethods.Post || request.Method == HttpMethods.Put && request.Body.CanRead)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Allows re-usage of the stream&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; request.EnableBuffering();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; request.Body.Seek(0, SeekOrigin.Begin);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; using (var stream = new StreamReader(request.Body, Encoding.UTF8, true, 1024, true))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var body = await stream.ReadToEndAsync();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Reset the stream so data is not lost&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; request.Body.Position = 0;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var bodyFeature = new RequestBodyFeature(body); // RequestBodyFeature is a simple POCO&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; httpContext.Features.Set(bodyFeature);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; request.Body.Seek(0, SeekOrigin.Begin);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; await next.Invoke();&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; app.UseMvc();}当我从我的 ExceptionFilter 登录到 ApplicationInsights 时,我会得到这样的主体:context.HttpContext?.Features.Get<RequestBodyFeature>()?.Body我来到这个结论看完后这个问题的ApplicationInsights GitHub的页面上这个问题的AspNetCore GitHub的页面上。

三国纷争

我解决了上面的问题,我在下面的博客中解释了解决方案。基本上它涉及使用消息处理程序将响应存储在请求消息中,并在实现 ITelemetryInitialize 的类中检索响应。这是详细解释的博客。https://thirum.wordpress.com/2019/08/19/logging-the-http-response-body-in-application-insights/
打开App,查看更多内容
随时随地看视频慕课网APP