15
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

4 回答 4

18

尚未准备好 .NET 4.5,但根据HttpContentHeaders.ContentTypeand MediaTypeHeaderValue,它应该看起来像这样:

content.Headers.ContentType = new MediaTypeHeaderValue("text/html");
于 2013-05-02T11:52:53.037 回答
4

此错误意味着您尝试添加一个已经添加到的标头DefaultRequestHeaders(不仅是content-type标头,还有任何其他不支持多个值的标头)。


在我的例子中,我从两个不同的地方启动了标头,并且不小心添加了两次相同的键标头(例如content-typeor Authentication)。

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()

于 2019-09-01T09:03:36.047 回答
4

一旦您通过执行此操作为 HttpContent 分配文本值-

HttpContent content = new StringContent(text);

内容类型是自动为该内容设置的。此内容类型(如果是字符串内容)是 -{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");

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

HttpContent content = new StringContent(text);  
content.Headers.Remove("content-type");  
content.Headers.Add("content-type", "text/html");
于 2020-05-29T18:15:03.433 回答
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>();
        }
于 2014-09-29T14:23:17.257 回答