【问题标题】:.NET HttpClient Request Content-Type.NET HttpClient 请求内容类型
【发布时间】:2016-04-08 12:44:41
【问题描述】:

我不确定,但在我看来,.NET HttpClient 库的默认实现是有缺陷的。看起来它在 PostAsJsonAsync 调用中将 Content-Type 请求值设置为“text/html”。我试图重置请求值,但不确定我是否正确执行此操作。任何建议。

public async Task<string> SendPost(Model model)
{
    var client = new HttpClient();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    var response = await client.PostAsJsonAsync(Url + "api/foo/", model);
    response.EnsureSuccessStatusCode();
    return await response.Content.ReadAsStringAsync();    
}

【问题讨论】:

  • 你能把你得到的错误贴出来吗?恕我直言,代码应该可以工作,正如其他人在 SO 上发布的那样:stackoverflow.com/questions/10679214/…
  • 我得到的错误是一般的“错误请求(400 状态代码)”。似乎默认内容类型值设置为“text/html”,而不是“application/json”。你会认为一个名为 PostAsJsonAsync 的方法会自动设置这个!
  • 我也遇到了这个问题?为什么PostAsJson 不会将内容类型设置为 json?它只是没有意义。

标签: c# .net json asp.net-web-api2


【解决方案1】:

您应该设置内容类型。使用“接受”,您可以定义您想要的响应。

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html Accept request-header 字段可用于指定响应可接受的某些媒体类型。接受标头可用于指示请求特别限于一小组所需类型,例如对内嵌图像的请求。

public async Task<string> SendPost(Model model)
{
    var client = new HttpClient(); //You should extract this and reuse the same instance multiple times.
    var request = new HttpRequestMessage(HttpMethod.Post, Url + "api/foo");
    using(var content = new StringContent(Serialize(model), Encoding.UTF8, "application/json"))
    {
        request.Content = content;
        var response = await client.SendAsync(request).ConfigureAwait(false);
        response.EnsureSuccessStatusCode();
        return await response.Content.ReadAsStringAsync().ConfigureAwait(false);
    }
}

【讨论】:

  • 为什么要使用 ConfigureAwait(false)?坏习惯。
  • 我不同意。这部分代码不依赖于上下文,所以最好使用 ConfigureAwait(false) 语法。这是一些有趣的阅读:msdn.microsoft.com/en-us/magazine/jj991977.aspx
  • @Esben 为什么你认为ConfigureAwait(false) 是个坏习惯?
  • 我的立场是正确的。我认为这是多余的绒毛,但似乎有充分的理由。
  • 购买这似乎是一种解决方法。为什么不在 httpclient 上使用PostAsJson() 方法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-07
  • 2013-02-20
  • 2011-11-19
  • 2019-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多