C# .NET HttpClient请求内容类型

C# .NET HttpClient请求内容类型,c#,.net,json,asp.net-web-api2,C#,.net,Json,Asp.net Web Api2,我不确定,但在我看来.NET HttpClient库的默认实现是有缺陷的。看起来它在PostAsJsonAsync调用中将内容类型请求值设置为“text/html”。我已尝试重置请求值,但不确定是否正确。任何建议 public async Task<string> SendPost(Model model) { var client = new HttpClient(); client.DefaultRequestHeaders.Accept.Add(new Medi

我不确定,但在我看来.NET HttpClient库的默认实现是有缺陷的。看起来它在PostAsJsonAsync调用中将内容类型请求值设置为“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();    
}
公共异步任务SendPost(模型)
{
var client=新的HttpClient();
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
var response=wait client.PostAsJsonAsync(Url+“api/foo/”,model);
response.EnsureSuccessStatusCode();
return wait response.Content.ReadAsStringAsync();
}

您应该设置内容类型。通过Accept,您可以定义所需的响应

Accept request header字段可用于指定响应可接受的某些媒体类型。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);
    }
}
公共异步任务SendPost(模型)
{
var client=new HttpClient();//您应该提取该实例并多次重用同一实例。
var request=newhttprequestmessage(HttpMethod.Post,Url+“api/foo”);
使用(var content=newstringcontent(Serialize(model),Encoding.UTF8,“application/json”))
{
request.Content=内容;
var response=await client.sendaync(请求).ConfigureAwait(false);
response.EnsureSuccessStatusCode();
返回wait response.Content.ReadAsStringAsync().configurewait(false);
}
}

您能将返回的错误张贴出来吗?我的意思是,代码应该可以工作,就像其他人在SO上发布的那样:我得到的错误是一个一般的“坏请求(400状态代码)”。默认内容类型值似乎设置为“text/html”,而不是“application/json”。您可能认为一个名为PostAsJsonAsync的方法会自动设置它!为什么要使用ConfigureWait(false)?坏习惯。我不同意。此部件代码不依赖于上下文,因此最好使用ConfigureAwait(false)语法。这里有一些有趣的读物:@Esben为什么你认为
ConfigureAwait(false)
是一个坏习惯?我可以纠正。我认为这是额外的绒毛,但似乎有一个很好的理由。