更新添加为 HttpClient 的 DefaultRequestHeaders 的自定义标头值

Posted

技术标签:

【中文标题】更新添加为 HttpClient 的 DefaultRequestHeaders 的自定义标头值【英文标题】:Updating custom header value added as DefaultRequestHeaders of HttpClient 【发布时间】:2017-02-10 10:23:27 【问题描述】:

我有一个跨请求共享的静态 httpclient,我想为其添加一个自定义标头。

httpClient.DefaultRequestHeaders.Add("customHeader", somevalue.ToString());

但我注意到,在每个请求中,值都会添加到我打算在每个请求中替换的标头中。如果标题已经存在,我会尝试删除它并再次添加,但它在 load test 上给我一个错误。

if (httpClient.DefaultRequestHeaders.Contains("customHeader"))
        
            httpClient.DefaultRequestHeaders.Remove("customHeader");
        
httpClient.DefaultRequestHeaders.Add("customHeader",somevalue.ToString());

错误 -

System.ArgumentException: An item with the same key has already been added.
System.InvalidOperationException: Collection was modified; enumeration operation may not execute.
System.ArgumentNullException: Value cannot be null.

如何更新每个请求的自定义标头值?

【问题讨论】:

不要将它添加到DefaultRequestHeaders,而是添加到实际的请求本身? 同时(并发)使用HttpClient.DefaultRequestHeaders对象会出问题。您应该通过 HttpRequestMessage 管理标头。 我建议你不要使用共享静态变量。导致并发问题的静态变量共享线程。我不使用静态httpclient。已经解决了。 @funbrain9 你对此有何看法?相反,重用套接字是一个很好的方法aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong 【参考方案1】:

我得到的错误:An item with the same key has already been added. Key: x

mahesh_ing 答案的示例代码:

var request = new HttpRequestMessage

    Method = this.method,
    RequestUri = new Uri(this.requestUri),
;

request.Headers.Add("Key", "Value");

var client = new System.Net.Http.HttpClient

    Timeout = this.timeout
;

return await client.SendAsync(request);

【讨论】:

【参考方案2】:

我使用 HttpRequestMessage 将标头添加到实际(当前)请求中,并用 SendAsync 而不是 GetAsync 替换了调用,它解决了我的问题。谢谢@levent。

【讨论】:

【参考方案3】:

我对 httpClient Default 请求标头有同样的问题。请参阅下面的示例,例如使用 HttpRequestMessage.headers。

 _httpClient.DefaultRequestHeaders.Clear();
 _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/xml"));

        XDocument requestXml = JsonConvert.DeserializeXNode(message.ToString());

        HttpRequestMessage webRequest = new HttpRequestMessage()
        
            Content = new StringContent(requestXml.Document.ToString().Replace("\r\n", string.Empty), Encoding.UTF8, "text/xml"),
            Method = HttpMethod.Post,
            RequestUri = new Uri(uri),
        ;
        webRequest.Headers.Add("CorrelationId", correlationId);
        webRequest.Headers.Add("SOAPAction", endpointSOAPAction);

我之前在我的相关 ID 和 soap 操作中使用了默认请求标头。

【讨论】:

以上是关于更新添加为 HttpClient 的 DefaultRequestHeaders 的自定义标头值的主要内容,如果未能解决你的问题,请参考以下文章

轻松把玩HttpClient之封装HttpClient工具类,携带Cookie的请求

使用 HttpClient 将 Content-Type 设置为“application/json”并将对象添加到正文

HttpClient调用

mysql多表更新删除

httpClient4.5 closeableHttpClient用法

.NET Core HttpClient请求异常详细情况分析