记录对应用程序洞察依赖性日志的响应正文

时间:2020-05-19 15:32:15

标签: c# .net httpclient azure-application-insights appinsights

我想在依赖表Application Insight中跟踪 httpclient 请求的响应正文。我的应用程序与.NET Framework 4.8一起运行 我创建了一个初始化器,以使用以下代码来跟踪“依赖关系”遥测:

public class TrackResponseBody : ITelemetryInitializer
{
    public void Initialize(ITelemetry telemetry)
    {
        var requestTelemetry = telemetry as DependencyTelemetry;

        if (requestTelemetry == null)
            return;

        if (requestTelemetry.TryGetOperationDetail("HttpResponse", out var responseObj))
        {
            var response = responseObj as HttpWebResponse;

            if (response != null)
            {
                using (var stream = response.GetResponseStream())
                {
                    var reader = new StreamReader(stream);
                    string result = reader.ReadToEnd();
                    requestTelemetry.Properties["ResponseBody"] = result;
                }
            }
        }
    }
}

但是当我尝试调用reader.ReadToEnd()时,我的代码会生成以下异常:System.NotSupportedException: 'The stream does not support concurrent IO read or write operations.'

如果我不尝试获取正文响应,则此代码可正确写入应用程序洞察依赖性日志中。

这就是我实现HttpClient的方式:

            var client_ = new HttpClient();

            client_.BaseAddress = new Uri("https://www.google.com");

            using (var request_ = new HttpRequestMessage())
            {
                request_.Method = new HttpMethod("GET");
                var response_ = await client_.SendAsync(request_).ConfigureAwait(false);
                var responseData_ = await response_.Content.ReadAsStringAsync().ConfigureAwait(false);
            }

有没有办法获取我的 HttpClient 的正文响应?

1 个答案:

答案 0 :(得分:0)

我自己尝试代码,在TrackResponseBody中,此行代码返回null:var response = responseObj as HttpWebResponse;response变量始终为null。

然后我做一个小小的更改,而不是将responseObj转换为HttpWebResponse,我只是将responseObj转换为字符串,然后将其添加到requestTelemetry.Properties中。代码如下:

public class TrackResponseBody: ITelemetryInitializer
{
    public void Initialize(ITelemetry telemetry)
    {
        var requestTelemetry = telemetry as DependencyTelemetry;

        if (requestTelemetry == null)
            return;

        if (requestTelemetry.TryGetOperationDetail("HttpResponse", out var responseObj))
        {
            var response = responseObj as HttpWebResponse;

            //convert responseObj to string
            string s = responseObj.ToString();
            requestTelemetry.Properties["ResponseBody"] = s;
        }
    }

}

测试结果:

enter image description here