c# - 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 检查请求时发现这是真的。
我试图在构造函数中在客户端上设置内容长度标头,但此后代码无法编译。我被困住了,不胜感激。谢谢
解决方案
您不想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);
推荐阅读
- android - Firestore 嵌套获取使用回调在初始调用时获取空结果
- c# - 使用字符串对象成员名称处理 IQueryable.OrderBy 扩展中的无效输入
- javascript - 我需要根据日期按降序对数组进行排序
- symfony - Symfony 3.4:NumberType 和 MoneyType 正在呈现文本类型的 html 输入而不是数字类型的输入
- macos - MAMP vhost:“在此服务器上找不到请求的 URL /。”
- c# - 双击datagridview后组合框中的SelectedValue
- python - 尝试使用 django 设置 mysql 时出错
- java - 在 Spring Boot 中使用 Pebble 模板引擎
- c# - C# Mongodb - 获取文档和匹配的数组元素
- html - 水平对齐一些 div