发送不带 DefaultRequestHeaders 的 HttpClient 请求

Chr*_*att 2 c# dotnet-httpclient

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

然而,现在,对于这个特定的端点,我需要删除它,而且我不确定如何或是否可能。让事情变得有些复杂的是,我正在处理一个单例范围的HttpClient实例,所以任何捏造的事情DefaultRequestHeaders都是不可行的。换句话说,我不能做一些像临时删除标头然后在请求之后将其添加回之类的黑客行为,因为这可能会影响正在发出的其他并发请求。令人沮丧的是,即使我下降到使用SendAsync自定义HttpRequestMessage实例,HttpClient 仍然添加标头。

另外,虽然它可以工作,但我真的不想在没有 HttpClient标头添加到DefaultRequestHeaders. 由于多种原因,在同一个类中使用两个不同的HttpClient实例似乎是一个非常糟糕的主意。

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

更新

我确实发现,对于自定义HttpRequestMessage实例,我可以通过将其设置为HttpRequestMessage. 由于它是明确设置的,因此HttpClient不会用默认版本覆盖它。这仍然意味着标头正在发送,但至少它实际上没有值。不过,如果存在的话,仍然对更好的解决方案感兴趣。

Evk*_*Evk 5

您可以在处理程序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);
    }
}
Run Code Online (Sandbox Code Playgroud)