C# HttpClient 自定义标头每个请求

cle*_*d87 2 c# header httpclient request

我注意到在修改HttpClient.DefaultRequestHeaders时使用 HttpClient不是线程安全的,但我想发出尽可能多的请求。每个请求我都需要一个自定义标头(另外两个标头始终相同)。URL也有点变化

  1. http://example.com/books/1234/readers/837
  2. http://example.com/books/854/readers/89
  3. http://example.com/books/29432/readers/238
  4. ... 很快

目前我正在为每个请求创建一个新的 HttpClient,但我觉得创建 10k+ HttpClients 不是这里的最佳选择。

我想制作一个带有 2 个 DefaultRequestHeaders 的静态 HttpClient,并为每个请求使用这个 HttpClient,但还要添加一个自定义标头。

我想尽快完成这个,所以如果你有别的东西,我会接受的。

        Parallel.ForEach(Requests, Request =>
        {
            var Client = new HttpClient();
            Client.DefaultRequestHeaders.Clear();
            Client.DefaultRequestHeaders.Add("Header1", "Value1");
            Client.DefaultRequestHeaders.Add("Header2", "Value2");
            Client.DefaultRequestHeaders.Add("Header3", "Value for exact this request");

            var response = Client.PutAsync(new Uri($"http://example.com/books/1234/readers/837"), null); //.Result (?)
            Client.Dispose();
        });
Run Code Online (Sandbox Code Playgroud)

sel*_*ape 5

不要DefaultRequestHeaders用于不适用于发送的所有请求的标头HttpClient

另外,不要为HttpClient每个请求创建一个。

您可以通过HttpRequestMessage为每个请求创建一个,应用您需要的任何标头,并在HttpClient整个请求中使用相同的标头来轻松做到这一点.SendAsync()

using (var request = new HttpRequestMessage(HttpMethod.Put, url)
{
    request.Headers.<add here>;
    // optionally set .Content

    using (var response = await httpClient.SendAsync(request))
    {
        // ... process response
    }
}
Run Code Online (Sandbox Code Playgroud)