.NET HttpClient 请求 Content-Type

10

我不确定,但是我认为.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();    
}

你能发一下你收到的错误吗?在我看来,这段代码应该是可以工作的,因为有其他人在 Stack Overflow 上发布了类似的问题和解答:https://dev59.com/72gv5IYBdhLWcg3wVPTU - Henry Liang
4
我收到的错误是"错误请求(400状态代码)"。看起来默认的内容类型值被设置为"text/html",而不是"application/json"。你会认为一个名为PostAsJsonAsync的方法会自动设置这个! - user167698
1
我也遇到了这个问题?为什么PostAsJson不会将内容类型设置为json呢?这根本就没有道理。 - Zapnologica
1个回答

9
你应该设置内容类型。使用Accept定义你想要的响应类型。http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html Accept请求头字段可用于指定可接受的媒体类型。 Accept头可以用于指示请求特定地限制为一小组所需类型,例如请求内联图像的情况。
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);
    }
}

1
为什么要使用ConfigureAwait(false)?这是个不好的习惯。 - Esben Skov Pedersen
2
我不同意。这部分代码不依赖于上下文,因此最好使用ConfigureAwait(false)语法。这里有一些有趣的阅读材料:https://msdn.microsoft.com/en-us/magazine/jj991977.aspx - Edwin van Vliet
1
@Esben 为什么你认为 ConfigureAwait(false) 是一个不好的习惯? - Yuval Itzchakov
3
我改变主意了。我曾认为这是多余的衬托,但似乎有一个很好的原因。 - Esben Skov Pedersen
买这个似乎是一个变通方法。为什么不直接使用HttpClientPostAsJson()方法呢? - Zapnologica

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