c# - 发送没有 DefaultRequestHeaders 的 HttpClient 请求
问题描述
我正在使用一个设计不佳的 API,在它的缺陷中,它有一个特定的端点,不应该提供特定的自定义标头,而实际上所有其他端点都需要它。因此,它包含在 中DefaultRequestHeaders
,因此我不需要将其手动添加到每个请求中。
但是,现在,对于这个特定的端点,我需要将其删除,而且我不确定如何或是否可能。使事情有些复杂化,我正在处理一个单例范围的HttpClient
实例,所以任何捏造DefaultRequestHeaders
都是不行的。换句话说,我不能做一些 hacky 的事情,比如暂时删除标头,然后在请求之后将其重新添加,因为这可能会影响其他并发请求。令人沮丧的是,即使我选择使用SendAsync
自定义HttpRequestMessage
实例,HttpClient
仍然会添加标题。
此外,虽然它 会起作用,但我真的不希望在HttpClient
没有将标头添加到DefaultRequestHeaders
. 由于许多原因,在同一个类中使用两个不同HttpClient
的实例似乎是一个非常糟糕的主意。
我在这里不走运,还是在过去一个小时内搜索互联网后我错过了一些解决方案?
更新
我确实找到了使用自定义HttpRequestMessage
实例的一件事,我可以通过将标题设置为HttpRequestMessage
. 因为它是显式设置的,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);
}
}
推荐阅读
- here-api - 带有避开区域和地理围栏/多边形的路由
- nixos - 我创建了一个派生并将其添加到 nix 商店,现在如何删除它?
- reactjs - 为什么 Mocha 找不到源文件?
- c# - 部署到 Azure 应用服务时的 OfficeConverter 问题
- flutter - 如果列表存储模型类,如何从列表中删除项目?
- gcc - gcc“-floop-unroll-and-jam”与“-funroll-loops”;有什么不同?
- python - 如何使用python从for循环中删除列表中的所有对象?
- python - pytest-html 无法识别的参数 --html
- html - 引导弹出框仅显示一次
- r - 需要从 r 中的不规则曲线中找到一条斜线的斜率