为了将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中记录响应吗?
以下是您必须执行的步骤: -
1)您必须实现ITelemetryInitializer。
2)将IHttpContextAccessor注入类并读取Initialize方法中的响应流。
3)确保传递的ITelemetry对象来自RequestTelemetry类型,并且HttpRequest是Post或Put。
4)然后,您可以使用IHttpContext.HttpContext.Response.Body属性读取响应,并使用Application Insight进行记录。
最后,在Startup.cs中的ConfigureService方法中注册您的类
我看,你没有实现ITelemetryInitializer,也读取了Initialize方法中的流
尝试这些步骤,看看它是否有帮助。