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

标签 c# dotnet-httpclient

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

相关文章:

c# - 获取 JSON 响应的选定值 c#

c# - 将对象绑定(bind)到 WPF TreeView

c# - ObjectListView 高级搜索和过滤

来自 Azure Function 的 C# HttpClient POST 请求(带有用于第三方 API 的授权标记)将被删除 header 和正文

c# - 异步等待 HttpClient.PostAsync 调用

c# - 将局部变量和值声明为 Debug模式

c# - 我可以获取 .ascx 文件以在类库中编译吗?

c# - 如何在 C# 中正确检查 HttpResponseMessage 的 http 状态代码?

c# - HttpClient 异步安全吗?

c# - 如何在 C# 中使用 HttpClient 获取所有重定向 URL 的列表