当使用 HttpClient 与外部资源通信时,需要手动跟踪请求的相关性。为了在 Application Insights 中呈现相关性,需要使用 IHttpContextAccessor 接口来收集传递给其他服务和 API 的每个请求的唯一标识符,并将其添加到 HttpClient 请求头中。这可以通过以下代码实现:
using Microsoft.ApplicationInsights;
using Microsoft.AspNetCore.Http;
using System.Net.Http;
using System.Threading.Tasks;
public class MyHttpClient : IMyHttpClient
{
private readonly HttpClient _httpClient;
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly TelemetryClient _telemetryClient;
public MyHttpClient(HttpClient httpClient,
IHttpContextAccessor httpContextAccessor,
TelemetryClient telemetryClient)
{
_httpClient = httpClient;
_httpContextAccessor = httpContextAccessor;
_telemetryClient = telemetryClient;
}
public async Task GetAsync(string uri)
{
// Create a new HttpRequestMessage and add the correlation ID to its headers
var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, uri);
httpRequestMessage.Headers.Add("x-correlation-id", _httpContextAccessor.HttpContext.TraceIdentifier);
// Start a new telemetry operation to track the HTTP request
using (var operation = _telemetryClient.StartOperation("MyHttpClient.GetAsync"))
{
try
{
// Send the HTTP request and get the response
var response = await _httpClient.SendAsync(httpRequestMessage);
operation.Telemetry.ResultCode = response.StatusCode.ToString();
return response;
}
catch (HttpRequestException ex)
{
operation.Telemetry.Success = false;
operation.Telemetry.ResultCode = ex.StatusCode?.ToString();
_telemetryClient.TrackException(ex);
throw;
}
}
}
}
在此示例中,我们创建了一个名为 MyHttpClient 的类,该类使用 IHttpContextAccessor 接口来收集每个请求的唯一标识符并将其添加到 HttpClient 请求头中。我们还使用 TelemetryClient 开始新的操作以跟踪 HTTP 请求,以便可以