在 .NET / ASP.NET Core 中,很多人会遇到 HttpClient 丢失请求头 的问题,尤其是在使用 DefaultRequestHeaders、或复用 HttpClient 的情况下。如果请求头没有正确生效,可能是以下几个原因:

  • 某些头(如 Content-TypeContent-Length)必须放在 请求内容(HttpContent) 上,而不是放在 DefaultRequestHeaders 中。
  • 使用同一个 HttpClient 时,修改 DefaultRequestHeaders 会影响所有请求,导致冲突。
  • 某些头(例如 Authorization)在重定向时可能丢失。

✅ 最佳实践:使用 HttpRequestMessage 来构造请求,确保请求头不会丢失

using System;
using System.Net.Http;
using System.Threading.Tasks;

public class HttpClientDemo
{
    private static readonly HttpClient _httpClient = new HttpClient();

    public static async Task SendRequestAsync()
    {
        // 构造请求消息
        var request = new HttpRequestMessage(HttpMethod.Post, "https://api.example.com/data");

        // 设置请求头(避免 DefaultRequestHeaders 污染全局)
        request.Headers.Add("Authorization", "Bearer your_token_here");
        request.Headers.Add("Custom-Header", "MyValue");

        // 设置请求体时,注意 Content-Type 必须放到 HttpContent.Headers
        request.Content = new StringContent("{\"name\":\"阿杰\"}", System.Text.Encoding.UTF8, "application/json");

        // 发送请求
        var response = await _httpClient.SendAsync(request);

        // 确保成功
        response.EnsureSuccessStatusCode();

        var result = await response.Content.ReadAsStringAsync();
        Console.WriteLine(result);
    }
}

🔑 优化要点

  1. 避免使用 DefaultRequestHeaders 来设置变化的头
    • HttpClient.DefaultRequestHeaders 会影响所有请求,不适合存放动态 Token、Request-ID 等。
    • 用 HttpRequestMessage.Headers 更灵活、安全。
  2. 特殊头必须放到 Content.Headers
    • Content-TypeContent-LengthContent-Encoding 等必须放在 request.Content.Headers 中。
  3. 推荐 HttpClientFactory(ASP.NET Core >= 2.1)
    • 避免手动管理 HttpClient 生命周期。
    • 结合 DelegatingHandler 可以自动加 Token、Tracing ID。
services.AddHttpClient("myapi", client =>
{
    client.BaseAddress = new Uri("https://api.example.com/");
    client.DefaultRequestHeaders.Add("User-Agent", "MyApp");
});


⚡ 总结:

  • DefaultRequestHeaders 只放固定不变的头(如 User-Agent)
  • 变化的头(如 Authorization)用 HttpRequestMessage 单独加
  • Content-Type 放在 HttpContent.Headers 中
  • 推荐 HttpClientFactory 统一管理 HttpClient,避免内存泄漏和头丢失问题。