C#使用HttpWebRequest发POST时头部出现异常字符报404问题求助
问题原因及解决方案
1 最可能原因:分块传输编码被自动启用
你看到的9位可变字符是HTTP分块传输的块长度前缀,为十六进制数值,会随请求体长度变化。
触发原因:你的_SetHeader方法仅手动添加了Content-Length请求头,没有给HttpWebRequest的ContentLength属性赋值。HttpWebRequest的内置逻辑会忽略手动添加的Content-Length头,只要没有显式给ContentLength属性赋值,就会自动启用分块传输,给请求体附加块长度前缀、结束标记,不支持分块传输的服务端会将前缀识别为请求报文的一部分,无法正确解析POST方法,返回404。
修复方案:
// 直接给ContentLength属性赋值,不要手动加Content-Length头 _req.ContentLength = _postData.Length; // 显式关闭分块传输,避免框架自动启用 _req.SendChunked = false;
2 次要原因:TCP连接复用的残留数据
HttpWebRequest默认开启Keep-Alive复用TCP连接,如果上一次请求的响应没有被完全读取(比如服务端返回了Gzip/Deflate压缩数据但你没有做解压缩处理),残留的响应数据会被拼接到下一次请求的开头。
修复方案:
先通过关闭连接复用验证问题是否消失:
_req.KeepAlive = false;
如果问题消失,说明是响应读取不完整导致,添加自动解压缩配置即可:
_req.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
3 排查方向:_SetHeader方法异常
检查_SetHeader方法的实现逻辑,确认是否存在错误写入字节到请求流、错误修改请求配置的问题。
补充建议
HttpWebRequest属于微软官方标记为过时的API,新项目推荐使用HttpClient处理HTTP请求,可规避绝大多数底层配置问题。
内容的提问来源于stack exchange,提问作者Joshua Son
相关产品推荐
相关产品推荐

