15

我在 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);
});

调试器 我也尝试过使用 Flurl 库,但在尝试添加“Content-Type”时它会崩溃。

misused header name content-type

那么我该如何强制它才能真正添加​​它呢?提前致谢。

4

3 回答 3

28

我认为你应该试试这个

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

结帐此链接:

如何为 HttpClient 请求设置 Content-Type 标头?

编辑

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

于 2015-03-04T09:52:01.110 回答
3

更新:查看非默认内容类型的新答案

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

于 2015-03-04T13:19:46.567 回答
2

Flurl 对此的最新和最好的答案是升级。2.0 在 headers 中引入了一些增强功能:

  1. 它们不再经过验证。Flurl 现在TryAddWithoutValidation在后台使用,因此您将永远不会在使用这些方法时遇到“错误使用的标头名称”错误WithHeader(s)。(我总是发现验证行为有点过度保护。)

  2. 在流畅的调用中,它们被设置在单个请求级别而不是级别,因此在重用客户端时FlurlClient不会遇到并发问题。

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

    url.WithHeaders(new { Content_Type = "foo", ... }
    
于 2017-10-24T22:13:29.473 回答