C# Web API 用[FromBody]接收Fiddler传入JSON字符串时仅获取部分内容
问题根源定位
- 服务端出现字符串截断的核心原因,是ASP.NET Web API针对
[FromBody]标记的string类型参数的默认JSON绑定规则,和实际发送的请求体格式不匹配。 - Web API默认的JSON请求体解析器(JsonMediaTypeFormatter)在把请求体内容绑定到string类型参数时,只会把请求体中符合JSON字符串字面量规范(即以双引号为起止边界的字符串值)的内容完整解析到参数上。
当请求体是JSON对象结构(以{开头)时,解析器会从请求体的起始位置开始逐字符读取,直到遇到第一个无转义的双引号就认定字符串读取完成。你遇到的服务端仅收到{"的现象完全匹配这个逻辑:请求体开头为{,紧随其后的第一个双引号就是Name属性前方的引号,解析器到此就终止读取,最终把{"两个字符作为参数值返回。 - 常见操作误区:在Fiddler的请求体编辑框中,输入的
\和"会被当成独立普通字符原样发送,不会被自动识别为JSON语法中的转义标识。如果没有给请求体加上正确的外层边界引号,发出去的内容就会被解析器判定为非字符串格式,触发截断逻辑。
对应修复方案
- 调整Fiddler的请求体格式,让内容符合JSON字符串字面量要求:如果需要把整段
{"Name": "Manas", "Age": "28"}作为字符串传给接口,请求体最外层需要包裹一对双引号,内部的双引号做正确转义,在Fiddler中填写的原始内容应为:
此时解析器会识别到外层双引号是字符串的起止边界,完整解析内部所有内容,不会出现截断。"{\"Name\": \"Manas\", \"Age\": \"28\"}" - 替换接口参数绑定逻辑,避免裸字符串接收:将string类型的参数替换为匹配JSON结构的强类型模型,让Web API自动完成结构化反序列化,从根源上消除字符串截断问题:
// 定义与JSON结构匹配的模型类 public class UserProfile { public string Name { get; set; } public string Age { get; set; } } [HttpPost] public void Method1([FromBody]UserProfile formData) { string encrypted = Security.Security.Encrypt(JsonConvert.SerializeObject(formData)); } - 如果业务要求必须接收原始请求字符串,可绕过默认的参数绑定流程,直接读取请求流中的原始字节内容,不经过JSON格式化器的语法解析,从根本上规避截断问题。
内容的提问来源于stack exchange,提问作者Abhishek Jain
相关产品推荐
相关产品推荐

