无法设置Content-Type标头

时间:2015-03-04 09:43:31

标签: c# windows-phone-8.1 httpclient flurl

我在HttpClient上设置Content-Type时遇到问题。 我跟着这个问题:How do you set the Content-Type header for an HttpClient request? 但仍然没有运气。

String rcString = JsonConvert.SerializeObject(new RoadsmartChecks() { userguid = user_guid, coords = coordinates, radius = (radius * 100) + "" }, ROADSMART_JSON_FORMAT, JSONNET_SETTINGS);
HttpClient c = new HttpClient();
c.BaseAddress = new Uri(BASE_URL);
c.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json"); //Keeps returning false
c.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", hash_aes);
c.DefaultRequestHeaders.TryAddWithoutValidation("Roadsmart-app", Constant.APP_ID);
c.DefaultRequestHeaders.TryAddWithoutValidation("Roadsmart-user", user_guid);
c.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Post, BASE_URL + URL_CHECKS + "/fetch");
req.Content = new StringContent(rcString);
await c.SendAsync(req).ContinueWith(respTask =>
{
    Debug.WriteLine("Response: {0}", respTask.Result);
});

Debugger 我也试过使用Flurl库,但在尝试添加' Content-Type'时崩溃了。

misused header name content-type

那么我该如何强制它以便真正添加呢? 提前谢谢。

3 个答案:

答案 0 :(得分:20)

我认为你应该试试这个

req.Content = new StringContent(rcString, Encoding.UTF8, "application/json");

结帐此链接:

How do you set the Content-Type header for an HttpClient request?

修改

删除此行c.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json");并检查

答案 1 :(得分:3)

更新:有关非默认内容类型,请参阅new answer

使用Flurl,您不需要为PostJsonAsync等方法将Content-Type设置为application / json。在这种情况下,这是默认的内容类型,它将为您设置。

答案 2 :(得分:1)

对于Flurl,最新和最好的答案是upgrade。 2.0在header dept中引入了几个增强功能:

  1. 他们不再经过验证。 Flurl现在使用了TryAddWithoutValidation,因此您永远不会使用WithHeader(s)方法获得“误用标题名称”错误。 (我总是发现验证行为有点过度保护。)

  2. 在流畅的通话中,他们设置的是单个请求级别而不是FlurlClient级别,因此在重新使用客户端时不会遇到concurrency issues

  3. 由于连字符在标题名称中很常见但在C#标识符中不允许,因此有一个new convention,其中下划线转换为连字符,因此在指定多个时不必放弃对象表示法:

    url.WithHeaders(new { Content_Type = "foo", ... }