在Application Insights中记录请求体对失败请求的最佳做法是什么?

时间:2017-05-03 20:27:43

标签: c# azure asp.net-web-api azure-application-insights

请求失败时记录HTTP请求正文的最佳方法是什么?

我通过覆盖异常记录器来记录未处理的异常:

 public class AiExceptionLogger : ExceptionLogger
{
    public override void Log(ExceptionLoggerContext context)
    {
        if (context != null && context.Exception != null)
        {
            ExceptionTelemetry telemetry = new ExceptionTelemetry(context.Exception);

            // the requestBody is always empty because the stream is non-rewinadable?
            string requestBody = context.Request.Content.ReadAsStringAsync().Result;
            telemetry.Properties.Add("Request Body", requestBody);

            Logger.LogException(telemetry);
        }
        base.Log(context);
    }
}

使用上面的代码,请求内容始终为空。我也尝试了this,但由于调用了GetBufferlessInputStream,因此抛出了一个不受支持的方法异常。所以这也不起作用。

我可以使用DelegatingHandler记录所有请求内容,但我只想记录由未处理的异常导致的请求失败的请求。

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

  

使用上面的代码,请求内容始终为空。

您可以使用ReadAsStreamAsync方法获取请求流并重置此流的位置。之后,您可以使用StreamReader从此Steam中读取内容。以下代码供您参考。我对它进行了测试,它在我身边工作得很好。

ExceptionTelemetry telemetry = new ExceptionTelemetry(context.Exception);

//Get request stream and reset the position of this stream
Stream requestBodyStream = context.Request.Content.ReadAsStreamAsync().Result;
requestBodyStream.Position = 0;
string requestBody = string.Empty;
using (StreamReader sr = new StreamReader(requestBodyStream))
{
    requestBody = sr.ReadToEnd();
}
telemetry.Properties.Add("Request Body", requestBody);

答案 1 :(得分:0)

你是对的。您无法像使用Streams一样重置Position属性。而是复制内容并阅读副本。

.one-quarter

答案 2 :(得分:0)

以下是Amor的替代方案 - 使用CopyTo

的MSFT答案
public class AiExceptionLogger : ExceptionLogger
{
    public  override async void Log(ExceptionLoggerContext context)
    {
        if (context != null && context.Exception != null)
        {
            ExceptionTelemetry telemetry = new ExceptionTelemetry(context.Exception);

            using (var ms = new MemoryStream())
            {
                await context.Request.Content.CopyToAsync(ms);
                var requestBody = Encoding.UTF8.GetString(ms.ToArray());
                telemetry.Properties.Add("Request Body", requestBody);
            }


            Logger.LogException(telemetry);
        }
        base.Log(context);
    }
}