首页 > 解决方案 > 发送没有 DefaultRequestHeaders 的 HttpClient 请求

问题描述

我正在使用一个设计不佳的 API,在它的缺陷中,它有一个特定的端点,不应该提供特定的自定义标头,而实际上所有其他端点都需要它。因此,它包含在 中DefaultRequestHeaders,因此我不需要将其手动添加到每个请求中。

但是,现在,对于这个特定的端点,我需要将其删除,而且我不确定如何或是否可能。使事情有些复杂化,我正在处理一个单例范围的HttpClient实例,所以任何捏造DefaultRequestHeaders都是不行的。换句话说,我不能做一些 hacky 的事情,比如暂时删除标头,然后在请求之后将其重新添加,因为这可能会影响其他并发请求。令人沮丧的是,即使我选择使用SendAsync自定义HttpRequestMessage实例,HttpClient 仍然会添加标题。

此外,虽然它 会起作用,但我真的不希望在HttpClient没有将标头添加到DefaultRequestHeaders. 由于许多原因,在同一个类中使用两个不同HttpClient的实例似乎是一个非常糟糕的主意。

我在这里不走运,还是在过去一个小时内搜索互联网后我错过了一些解决方案?

更新

我确实找到了使用自定义HttpRequestMessage实例的一件事,我可以通过将标题设置为HttpRequestMessage. 因为它是显式设置的,HttpClient所以不会用默认版本覆盖它。这仍然意味着正在发送标头,但至少它实际上没有值。但是,如果存在更好的解决方案,仍然对它感兴趣。

标签: c#dotnet-httpclient

解决方案


您可以在处理程序SendAsync覆盖中执行此操作,因为此时HttpClient已经为您的请求添加了默认标头。如果您不使用自定义处理程序 - 您可以继承HttpClientHandler并使用它,因为new HttpClient()它与new HttpClient(new HttpClientHandler()). 例如:

public static void Main(string[] args) {
    HttpClient c = new HttpClient(new MyHttpClientHandler());
    c.DefaultRequestHeaders.Add("X-Test", "1");
    var res = c.GetAsync("http://google.com").Result;
}

class MyHttpClientHandler : HttpClientHandler {
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) {
        // check for your endpoint
        if (request.RequestUri.Host == "google.com") {
            // remove
            request.Headers.Remove("X-Test");
        }

        return base.SendAsync(request, cancellationToken);
    }
}

推荐阅读