首页 > 解决方案 > Asp.Net core HttpClient 得到响应 411 length required 错误

问题描述

我正在尝试创建一个使用 C# HttpClient 将一些数据发布到 API 端点的服务。代码如下。

public class HttpClientService : IHttpClientService
{
    static HttpClient client = new HttpClient();

    public HttpClientService()
    {
        client.BaseAddress = new Uri("http://xx.xx.xx.xx/");
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    }

    public async Task<Uri> MakeLogEntry(CnsLog log)
    {
        HttpResponseMessage response = await client.PostAsJsonAsync("api/logs", log);
        return response.Headers.Location;
    }

}

问题是端点返回错误 411 Length Required。我发现这是因为我的请求没有设置 content-length 标头,当我使用 Fiddler 检查请求时发现这是真的。

我试图在构造函数中在客户端上设置内容长度标头,但此后代码无法编译。我被困住了,不胜感激。谢谢

标签: c#asp.netdotnet-httpclient

解决方案


您不想Content-Length在客户端上设置标头,尤其是因为它是一个静态实例。您想根据个人请求进行设置。

PostAsJsonAsync是一个很好的快捷方式,它HttpContent从 poco 构建,HttpRequestMessage从该内容构建,并发送 POST 请求。很方便,但所有这些抽象都没有让您有机会设置请求级标头。因此,您需要做更多的工作来构建/发送请求:

var json = JsonConvert.SerializeObject(log);
var content = new StringContent(json, Encoding.UTF8, "application/json");
content.Headers.ContentLength = json.Length;
var response = await client.PostAsync("api/logs", content);

推荐阅读