HttpRequestMessage 多个自定义标头相互覆盖

Posted

技术标签:

【中文标题】HttpRequestMessage 多个自定义标头相互覆盖【英文标题】:HttpRequestMessage multiple custom headers overwriting each other 【发布时间】: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 对象。

【问题讨论】:

【参考方案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");

*** 上有很多accept 和authorization 的示例。

【讨论】:

以上是关于HttpRequestMessage 多个自定义标头相互覆盖的主要内容,如果未能解决你的问题,请参考以下文章

HttpRequestMessage.GetClientCertificate() 在 Web API 中返回 null

Flink Table API & SQL 自定义 Table 表函数

Flink Table API & SQL 自定义 Scalar 标量函数

android自定义高级控件(价格标)

c# 如何正确传递 HttpRequestMessage 并在函数外返回 HttpRequestMessage 而不会泄漏

如何自定义 app.json 以使用 Expo 构建白标应用