c# - 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(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 的深度克隆,假设所有内容负载都已下载,我们会研究这个选项。

有人遇到过这个问题吗?如果遇到过,您是如何解决的?

提前致谢。

最佳答案

对我来说,您的堆栈跟踪与阅读响应相关联是没有意义的。似乎更有可能的是,在您发出请求之前,您有线程争先恐后地添加 header 。也许与异步调试有些混淆? 当我有这样一行时,我已经看到了这一点(客户端是 HttpClient)

client.DefaultRequestHeaders.AcceptEncoding.Add(new System.Net.Http.Headers.StringWithQualityHeaderValue("gzip"));

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

关于c# - HttpContent:已添加具有相同键的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43057819/

相关文章:

c# - WatiN 引用的程序集错误

C#线程方法返回一个值?

java - REST 服务和竞争条件

c# - HttpContent.ReadAsAsync 在哪里?

java - 从 HttpObject Netty 获取 HttpContent - Java

c# - 为什么要使用 yield 关键字,而我只能使用普通的 IEnumerable?

c# - Blob 触发器 : Storage account is not configured

c - 如何无害地杀死子进程

Verilog:以下代码会产生竞争条件吗?