HttpClient DefaultRequestHeaders授权异常

时间:2017-05-17 19:50:59

标签: c# api http-headers token httpclient

我有一个私有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参数传递给它。我不是说这是世界上最糟糕的事情,但我正在寻找替代方案,如果有的话。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我认为这个问题的方法是分析我想要的东西。我想重用HttpClient但处理任何授权标头。我能想到的最佳方法是使用HttpRequestMessage并将令牌传递给我的DoRequest方法。在我的方法中,我做:

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