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

mah*_*ing 7 c# httpclient asp.net-web-api

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

httpClient.DefaultRequestHeaders.Add("customHeader", somevalue.ToString());
Run Code Online (Sandbox Code Playgroud)

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

if (httpClient.DefaultRequestHeaders.Contains("customHeader"))
        {
            httpClient.DefaultRequestHeaders.Remove("customHeader");
        }
httpClient.DefaultRequestHeaders.Add("customHeader",somevalue.ToString());
Run Code Online (Sandbox Code Playgroud)

错误 -

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.
Run Code Online (Sandbox Code Playgroud)

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

Ger*_*hes 6

我得到的错误: 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);
Run Code Online (Sandbox Code Playgroud)


mah*_*ing 5

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


小智 5

我对 httpClient 默认请求标头有同样的问题。请参阅下面的示例,使用 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);
Run Code Online (Sandbox Code Playgroud)

我之前使用默认请求标头来执行我的correlationid 和soap 操作。