【问题标题】:HttpRequestMessage multiple custom headers overwriting each otherHttpRequestMessage 多个自定义标头相互覆盖
【发布时间】:2015-07-09 02:03:07
【问题描述】:

我很难理解如何将多个标头添加到 HttpRequestMessage。我的意思是我掌握了基础知识,如果我做一个标题它可以工作,但多个标题和最后一个是什么棒,所有其他的都被覆盖?

因此,例如 Accept 标头将被覆盖,但授权标头将被粘贴。

HttpRequestMessage httpreqmsg = new HttpRequestMessage();
httpreqmsg.Headers.Add("Accept", "CustomAccept");
httpreqmsg.Headers.Add("Authorization", "asdfas#%fwqerq@werfds...");

现在 HttpRequestMessage 有一个带有签名的重载

.Add(string, List<string>) 

如果您有一个具有多个值的名称,那很好,但是您如何处理多个标题。 TryAddWithoutValidation 的重载和上面一样吗?

TIA


太好了...所以我在帖子中犯了一个错误。我不认为这很重要,但确实如此。我正在对控制器进行单元测试,因此没有创建 HttpClient 对象。

【问题讨论】:

    标签: c# asp.net-web-api


    【解决方案1】:

    似乎“接受”标头已保留。无论我尝试为其分配什么值,都会引发 FormatException。

    如果您将代码更改为此,您将获得两个标题。

            HttpRequestMessage httpreqmsg = new HttpRequestMessage();
            httpreqmsg.Headers.Add("Lolz", "CustomAccept");
            httpreqmsg.Headers.Add("Authorization", "SomeValue");
    
            foreach (var item in httpreqmsg.Headers)
            {
                Console.WriteLine(item.Key + " : " + item.Value);
            }
    

    您的示例中的“授权”值也是无效的,但我猜这只是随机密钥混搭:)

    【讨论】:

      【解决方案2】:

      不确定代码的上下文,但您可以改用 HttpClient (WebApi NuGet),它可以让您添加“Accept”和“Authorization”标头:

                  using (var client = new HttpClient())
                  {
                      client.BaseAddress = new Uri();
                      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
                      client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("scheme", "param");
      
                      //client.PostAsJsonAsync or something else
      
                  }
      

      【讨论】:

      • 我猜他们已经在使用 HttpClient,它们都是 System.Net.Http 的一部分(我认为是正确的命名空间)。还将解释为什么“接受”似乎是一个保留的标题。 :)
      【解决方案3】:

      以@sidjames 的帖子为基础。看来您正在寻找 Accept 和 Authorization 标头。如果是这种情况,那么在 HttpClient 中设置它,而不是在 HttpRequestMessage 中:

      httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("some accept"));
      httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", "your parameters");
      

      StackOverflow 上有很多acceptauthorization 的示例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-04
        • 2017-07-01
        相关资源
        最近更新 更多