gpt4 book ai didi

c# - 发送不带 DefaultRequestHeaders 的 HttpClient 请求

转载 作者:行者123 更新时间:2023-12-02 03:35:20 25 4
gpt4 key购买 nike

我正在使用一个设计不佳的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com