C# HttpContent:已添加具有相同密钥的项

C# HttpContent:已添加具有相同密钥的项,c#,race-condition,httpcontent,C#,Race Condition,Httpcontent,我们在代码库中看到了以下堆栈跟踪: System.ArgumentException: An item with the same key has already been added. at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) at System.Net.Http.Headers.HttpHeaders.AddHeaderToStore(Strin

我们在代码库中看到了以下堆栈跟踪:

System.ArgumentException: An item with the same key has already been added. 
   at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) 
   at System.Net.Http.Headers.HttpHeaders.AddHeaderToStore(String name, HeaderStoreItemInfo info) 
   at System.Net.Http.Headers.HttpHeaders.SetParsedValue(String name, Object value) 
   at System.Net.Http.Headers.HttpContentHeaders.get_ContentLength() 
   at System.Net.Http.HttpClientHandler.PrepareAndStartContentUpload(RequestState state) 
并将其缩小到代码中我们调用

HttpContent.ReadAsStringAsync()
当这种情况发生时,我们确信HttpContent的实例正在被多个线程使用,所有线程都试图读取实际内容。还没有弄清楚阅读内容如何影响标题

如果有可能执行HttpContent的深度克隆,假设内容负载已经下载,那么我们会研究这个选项

有人碰到这个问题,如果是的话,你是怎么解决的


提前感谢。

我认为您的stacktrace链接到响应的读取是毫无意义的。似乎更可能的情况是,在发出请求之前,线程正在努力添加头。可能是异步调试的一些混乱? 当我有这样一行代码时,我看到了这一点(客户端是一个HttpClient)

client.DefaultRequestHeaders.AcceptEncoding.Add(新的System.Net.Http.Headers.StringWithQualityHeaderValue(“gzip”)


在每个线程都可以执行的代码上,它就变成了一个竞争条件,因为我相信httpclient会在添加它之前检查存在性,然后如果在这段时间内两个线程尝试添加它,它就会像这样崩溃。根据您的设置,您可能需要将类似的内容移动到初始化中,或者在其周围设置一个锁。

请提供一些复制代码。这看起来像是您正在尝试上载内容,但由于某些原因,它无法添加内容长度标题,但如果没有更多代码,很难判断。