最近在項目中發現,HttpClient中調用某Api總是出現403的異常,自己使用postman 調用即沒有問題,經排查是HttpClient 會自動添加traceparent請求頭
Accept-Encoding: gzip User-Agent: Firefox/5.0 (Linux 3.4; rv:14.0) Gecko/20100101 Firefox/91.0 traceparent: 00-274628f3ce14109d06680c90e8cc19ca-42e0b82e7d106403-00 Content-Type: application/x-www-form-urlencoded Content-Length: 160
原因是:在HttpClient 調用SendAsync 時,如果Activity的IdFormat 等於ActivityIdFormat.W3C 就會添加traceparent參數
代碼來源:https://github.com/dotnet/runtime/blob/release/5.0/src/libraries/System.Net.Http/src/System/Net/Http/DiagnosticsHandler.cs#L286
private static void InjectHeaders(Activity currentActivity, HttpRequestMessage request)
{
if (currentActivity.IdFormat == ActivityIdFormat.W3C)
{
if (!request.Headers.Contains(DiagnosticsHandlerLoggingStrings.TraceParentHeaderName))
{
request.Headers.TryAddWithoutValidation(DiagnosticsHandlerLoggingStrings.TraceParentHeaderName, currentActivity.Id);
if (currentActivity.TraceStateString != null)
{
request.Headers.TryAddWithoutValidation(DiagnosticsHandlerLoggingStrings.TraceStateHeaderName, currentActivity.TraceStateString);
}
}
}
.....
}
所以這裏把Activity.Current=null即可
Activity.Current = null; var response = await _httpClient.PostAsync("your url", content);
參考文獻:c# - Remove TraceParent header from HttpClient requests - Stack Overflow