【问题标题】:HttpClient DefaultRequestHeaders Authorization ExceptionHttpClient DefaultRequestHeaders 授权异常
【发布时间】:2017-05-17 19:50:59
【问题描述】:

我的班级有一个私人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# api http-headers token httpclient


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      你可以检查一下它是否已经在那里:

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

      【讨论】:

      • 我不知道我是否可以异步信任它,因为它可能在我检查的毫秒内不存在,然后在我尝试设置它时就存在。
      • 如果您将整个检查包装在一个 lock 语句中,您应该是线程安全的。我已经更新了我的答案以反映这一点。
      • 我不这么认为,这会破坏使我的调用异步的全部意义。感谢您尝试提供帮助,但将令牌传递给我的 DoRequest 方法是 IMO 更好的解决方案。
      • lock 方法确保共享资源不会被多个线程同时访问,这是您在第一条评论中试图完成的。如果使用锁是一个坏主意,那么没有多线程应用程序可以共享资源。 FWIW,将令牌传递给 DoRequest 也是一种可接受的解决方案 IMO :)
      • 你是对的。根据我一直在寻找的,这是一个解决方案。感谢您的帮助乔希。
      猜你喜欢
      • 1970-01-01
      • 2011-10-26
      • 2016-08-06
      • 2021-06-05
      • 2015-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      相关资源
      最近更新 更多