HttpClient DefaultRequestHeaders 授权异常

问题描述 投票:0回答:2

我有一个有私人

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 参数。我并不是说这是世界上最糟糕的事情,而是正在寻找替代方案(如果存在)。

c# http-headers token dotnet-httpclient
2个回答
1
投票

我思考这个问题的方式是通过分析我想要的东西。我想重新使用

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.