我有一个有私人
HttpClient
的课程。我有一个 DoRequest
方法来处理我的所有请求并采用内容/参数的模板对象。到目前为止我已经打了2个电话。一种是检索令牌,一种是获取其他信息 (GetInfo)。我的 GetInfo
方法需要设置授权标头,因此我在调用 DoRequest
: 之前执行此操作
this.Client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
一旦我开始进行
Parallel.For
进行负载测试,有时我就会开始遇到 An item with the same key has already been added
异常。现在我明白标题存储在字典中,这就是为什么我收到异常,但我正在寻找如何解决这个问题的想法,同时保留我的 DoRequest
设计。我想解决这个问题的一种方法是在我的 HttpContent
对象中设置标头,但它位于我的 DoRequest
方法中,我现在需要向它传递一个 Token 参数。我并不是说这是世界上最糟糕的事情,而是正在寻找替代方案(如果存在)。
我思考这个问题的方式是通过分析我想要的东西。我想重新使用
HttpClient
但丢弃任何授权标头。我认为最好的方法是使用 HttpRequestMessage
并将令牌传递给我的 DoRequest
方法。按照我的方法,我这样做:
HttpRequestMessage reqmsg = new HttpRequestMessage(method, uri);
reqmsg.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token ?? string.Empty);
reqmsg.Content = formContent;
您可以检查一下它是否已经在那里:
static readonly object _o = new object();
...
lock (_o){
if (!this.Client.DefaultRequestHeaders.Contains("Authorization"))
this.Client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
}