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
相关产品推荐
相关产品推荐

