You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PutAsync未发送消息体:JSON请求体发送异常技术求助

解决PutAsync未发送消息体的问题

看起来你的代码里有几个关键问题导致PutAsync没有正确发送消息体,我来帮你拆解并修正:

首先,先梳理你代码里的核心问题:

  • 手动设置ContentLength的方式错误:你用bodyString.Length得到的是字符串的字符数,但HTTP协议要求的Content-Length是请求体的字节数。如果你的JSON里包含非ASCII字符(比如中文、特殊符号),字符数和字节数会不匹配,服务器收到后会因为长度校验失败直接丢弃请求体,看起来就像没发送一样。
  • 重复设置ContentType:StringContent的构造函数已经传入了编码和contentType,之后再赋值stringContent.Headers.ContentType属于冗余操作,甚至可能导致编码和媒体类型的不一致。
  • 字节转字符串再包装的冗余流程:序列化后直接得到的字节数组已经是可以直接发送的请求体,转成字符串再用StringContent包装反而可能引入编码错误。

修正方案一(推荐,最可靠)

直接使用ByteArrayContent包装序列化后的字节数组,跳过字符串转换步骤:

var data = await SerializationAdapter.SerializeAsync<TBody>(body);
var byteContent = new ByteArrayContent(data);
byteContent.Headers.ContentType = new MediaTypeHeaderValue(contentType);
result = await _HttpClient.PutAsync(queryString, byteContent);

修正方案二(如果坚持用StringContent)

保留字符串转换,但绝对不要手动设置ContentLength,让StringContent自动处理字节长度计算:

var data = await SerializationAdapter.SerializeAsync<TBody>(body);
var bodyString = Encoding.GetString(data);
var stringContent = new StringContent(bodyString, Encoding, contentType);
// 移除手动设置ContentLength和重复设置ContentType的代码
result = await _HttpClient.PutAsync(queryString, stringContent);

为什么原代码会失效?

当你手动指定ContentLength为字符数时,StringContent实际发送的字节数(根据编码转换后的结果)和你设置的长度不匹配,服务器会认为请求体不完整,直接忽略掉整个消息体,这就是你看到"未发送消息体"的原因。另外,StringContent内部已经会正确设置Content-Type和Content-Length,手动干预反而容易出错。

内容的提问来源于stack exchange,提问作者Christian Findlay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:25:42