3 回答
TA贡献1887条经验 获得超5个赞
你必须实施ITelemetryInitializer
. 将 注入IHttpContextAccessor
到类中并读取Initialize
方法内的响应流。确保传递的ITelemetry
对象来自类型RequestTelemetry
并且 HttpRequest 是 Post 或 Put。然后,您可以使用该IHttpContext.HttpContext.Response.Body
属性读取响应并使用 Application Insight 将其记录下来。
最后,在 Startup.cs 的 ConfigureService 方法中注册您的类
TA贡献1859条经验 获得超6个赞
我通过添加一个中间件来解决这个问题,该中间件将请求正文保存为HttpContext. app.UseMvc()由于 Mvc 框架处理流,因此之前注册中间件很重要。
启动文件
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.Use(async (httpContext, next) =>
{
var request = httpContext.Request;
if (request.Method == HttpMethods.Post || request.Method == HttpMethods.Put && request.Body.CanRead)
{
//Allows re-usage of the stream
request.EnableBuffering();
request.Body.Seek(0, SeekOrigin.Begin);
using (var stream = new StreamReader(request.Body, Encoding.UTF8, true, 1024, true))
{
var body = await stream.ReadToEndAsync();
//Reset the stream so data is not lost
request.Body.Position = 0;
var bodyFeature = new RequestBodyFeature(body); // RequestBodyFeature is a simple POCO
httpContext.Features.Set(bodyFeature);
}
request.Body.Seek(0, SeekOrigin.Begin);
}
await next.Invoke();
});
app.UseMvc();
}
当我从我的 ExceptionFilter 登录到 ApplicationInsights 时,我会得到这样的主体:
context.HttpContext?.Features.Get<RequestBodyFeature>()?.Body
我来到这个结论看完后这个问题的ApplicationInsights GitHub的页面上这个问题的AspNetCore GitHub的页面上。
TA贡献1804条经验 获得超7个赞
我解决了上面的问题,我在下面的博客中解释了解决方案。基本上它涉及使用消息处理程序将响应存储在请求消息中,并在实现 ITelemetryInitialize 的类中检索响应。
这是详细解释的博客。
https://thirum.wordpress.com/2019/08/19/logging-the-http-response-body-in-application-insights/
- 3 回答
- 0 关注
- 235 浏览
添加回答
举报