我正在使用一个设计不佳的 API,其缺陷之一是,它有一个特定的端点不应提供特定的自定义 header ,而实际上每个其他端点都需要它。因此,它包含在 DefaultRequestHeaders
中,因此我不需要将其手动添加到每个请求中。
但是,现在,对于这个特定端点,我需要删除它,而且我不确定如何或是否可能。让事情变得有些复杂的是,我正在处理单例范围的 HttpClient
实例,因此任何对 DefaultRequestHeaders
的修改都是不行的。换句话说,我不能做一些像临时删除 header 然后在请求之后将其添加回之类的黑客行为,因为这可能会影响正在发出的其他并发请求。令人沮丧的是,即使我将 SendAsync
与自定义 HttpRequestMessage
实例一起使用,HttpClient
仍然添加 header 。
此外,虽然它可以工作,但我真的不想在没有将 header 添加到 DefaultRequestHeaders
的情况下注入(inject)另一个 HttpClient
实例。由于多种原因,在同一个类中使用两个不同的 HttpClient 实例似乎是一个非常糟糕的主意。
我在这里运气不好,还是在过去一个小时搜索互联网后我错过了一些解决方案?
更新
我确实发现,通过自定义 HttpRequestMessage
实例,我可以通过将其设置为 HttpRequestMessage
上的空字符串来清除 header 。由于随后显式设置了它,HttpClient
不会使用默认版本覆盖它。这仍然意味着 header 正在发送,但至少它实际上没有值。不过,仍然对更好的解决方案感兴趣(如果存在)。
最佳答案
您可以在处理程序 SendAsync
重写中执行此操作,因为此时 HttpClient
已向您的请求添加默认 header 。如果您不使用自定义处理程序 - 您可以从 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);
}
}
关于c# - 发送不带 DefaultRequestHeaders 的 HttpClient 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50399003/