2017-05-17 51 views
0

我有一个私人类HttpClient。我有一个DoRequest方法来处理我所有的请求,并为内容/参数提供一个模板对象。到目前为止,我有2个电话。一个是检索一个令牌,另一个是获取其他信息(GetInfo)。我GetInfo方法将需要授权头设置,所以我做这个调用DoRequest前:HttpClient DefaultRequestHeaders授权异常

this.Client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); 

当我开始做一个Parallel.For用于负载测试,我开始变得一An item with the same key has already been added例外,有时。现在我明白,标题存储在字典中,这就是为什么我得到例外,但我正在寻找如何解决这个问题的想法,同时保留我的DoRequest设计。我想解决这个问题的方法之一是在我的HttpContent对象中设置标题,但是它存在于我的DoRequest方法中,我现在需要将一个标记参数传递给它。我不是说这是世界上最糟糕的事情,但我们正在寻找替代品,如果有的话。

回答

0

我经过深思熟虑这个问题的方法是通过分析我想要的东西。我想重新使用HttpClient,但处置任何授权标头。我认为最好的方法是使用HttpRequestMessage并将令牌传递给我的DoRequest方法。在我的方法,我这样做:

HttpRequestMessage reqmsg = new HttpRequestMessage(method, uri); 
reqmsg.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token ?? string.Empty); 
reqmsg.Content = formContent; 
0

你可以检查,看看它是否已经在那里:

static readonly object _o = new object(); 
... 
lock (_o){ 
    if (!this.Client.DefaultRequestHeaders.Contains("Authorization")) 
     this.Client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); 
} 
+0

我不知道我是否可以异步信任,因为它可能不存在毫秒我检查,然后存在,当我尝试设置它。 – Pittfall

+0

如果将整个支票包装在锁定语句中,则应该是线程安全的。我已经更新了我的答案以反映这一点。 –

+0

我不这么认为,那将会使我的呼叫异步化。感谢您尝试提供帮助,但将令牌传递给我的“DoRequest”方法是IMO的更好解决方案。 – Pittfall