C# HttpClient,出现错误“无法添加值,因为标头‘content-type’不支持多个值”

16
HttpClient serviceClient = new HttpClient();
serviceClient.DefaultRequestHeaders.Add("accept", "Application/JSON");

HttpContent content = new StringContent(text);
content.Headers.Add("content-type", "text/html");

var response = await serviceClient.PostAsync(new Uri(_serviceUrl), content);

这是我的代码。我想要进行POST请求,并将内容类型设置为text/html,但是当我这样做时,会出现上面的错误。

似乎可以通过content.Headers.ContentType来设置内容类型,但我不知道如何指定"text/html"。有人可以帮忙吗?

4个回答

20

4
content.Headers.ContentType = new MediaTypeHeaderValue("text/html") 被接受了,也许就是这样。它的参数是 string mediaType - NibblyPig
@SLC 所以应该是 content.Headers.ContentType = new MediaTypeHeaderValue("text/html") - CodeCaster
我相信它不会出错,但谁知道它是否发送了正确的标头。通常内容类型也包括字符编码,但附加它会生成错误,所以我现在忽略它... - NibblyPig

5
一旦你通过这样做将文本值分配到 HttpContent 中-
HttpContent content = new StringContent(text);

当内容为String类型时,其内容类型会自动设置为-{text/plain; charset=utf-8}

因此,在下一步尝试显式设置Content-Type标头时,会出现错误-无法添加值,因为标头“Content-Type”不支持多个值。

有三种方法可以设置内容类型并避免此错误:

选项1. 设置内容时指定内容类型

HttpContent content = new StringContent(text, System.Text.Encoding.UTF8, "text/html");

选项2.设置ContentType属性

HttpContent content = new StringContent(text);    
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("text/html");

选项三:首先删除自动分配的内容类型头,然后再添加该头。

HttpContent content = new StringContent(text);  
content.Headers.Remove("content-type");  
content.Headers.Add("content-type", "text/html");

4

这个错误表示您试图添加一个已经被添加到DefaultRequestHeaders的标头(不仅是content-type标头,还包括任何不支持多个值的其他标头)。


在我的情况下,我从两个不同的地方初始化了头部,并意外地添加了相同的键头两次(例如content-typeAuthentication)。

startup.cs中,使用IHttpClientFactory文档):

services.AddHttpClient("MyHttpClient", client =>
{
    client.BaseAddress = new Uri("https://www.google.co.il/");
    client.Timeout = new TimeSpan(0, 1, 0);
    client.DefaultRequestHeaders.Add("content-type", "application/json"));
    client.DefaultRequestHeaders.Add("Authorization", "some values"));
});

并且在客户端服务内得到了更新:

HttpClient httpClient = this._httpClientFactory.CreateClient("MyHttpClient");    
httpClient.DefaultRequestHeaders.Add("content-type", "application/json")); //Throws Exception!
httpClient.DefaultRequestHeaders.Add("Authorization", "some values")); //Throws Exception!

更新: 如果你想要确保能够添加标头,可以小心地使用 DefaultRequestHeaders.Clear()

0
  var settings = new JsonSerializerSettings()
        {
            DateFormatHandling =
                DateFormatHandling.MicrosoftDateFormat
        };
        var serializedString = JsonConvert.SerializeObject(data, settings);

        var conent = new StringContent(serializedString);
        conent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
        var response = await this.httpClient.PostAsync(requestUri, conent).ConfigureAwait(false);

        T requestResult = default(T);
        if (response.IsSuccessStatusCode)
        {
            response.EnsureSuccessStatusCode();
            requestResult = await response.Content.ReadAsAsync<T>();
        }

2
请仅返回翻译后的文本:请为您的答案添加一些解释,展示代码的功能和解决问题的方法。这将有助于未来的读者。def fibonacci(n): if n <= 1: return n else: return (fibonacci(n-1) + fibonacci(n-2))这是一个递归函数,用于计算斐波那契数列中第n个数字。当n小于或等于1时,函数返回n。否则,它将调用自身两次,并返回前两个数字之和。 - Our Man in Bananas
如果请求失败,response.EnsureSuccessStatusCode(); 会抛出异常,因此检查 response.IsSuccessStatusCode 没有意义。 - davidthegrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接