RestSharp升级至108.0.1后AddJsonBody问题及参数接收异常求助
RestSharp从106.9.0升级到108.0.1后的POST请求适配问题
原106.9.0版本工作代码
string sParmDb = Newtonsoft.Json.JsonConvert.SerializeObject(parmsDb); // parmsDb是无法通过查询参数传递的大对象 sParmDb = System.Web.HttpUtility.UrlEncode(sParmDb); RestSharp.RestRequest restCall; RestSharp.RestClient cl = new RestSharp.RestClient(); RestSharp.RestResponse rsp; string sQueryStr = "http://myWebService"; restCall = new RestSharp.RestRequest(sQueryStr, RestSharp.Method.POST); restCall.AddJsonBody(sParmDb); rsp = (RestSharp.RestResponse)cl.Execute(restCall);
升级到108.0.1后的问题
- 编译错误:
RestSharp.Method枚举中不再有POST,改为Post;RestRequest无AddJsonBody方法,添加RestSharp.Extensions命名空间后可编译通过。 - 编译通过后调用本地Web服务时,服务端
[FromBody] string value参数始终为null。
服务端代码
public string Post([FromBody] string value) { // 处理value并返回结果 }
解决方案
核心问题原因
RestSharp 108+版本对AddJsonBody的行为做了调整:旧版本传入字符串时会直接将其作为请求体内容,新版本则会将字符串当作普通对象进行JSON序列化,导致请求体变成转义后的字符串(如"\"abcdefg\""),服务端无法正确解析为[FromBody] string。
适配代码
根据不同场景选择以下方式:
场景1:传递复杂对象(原代码中的parmsDb)
无需手动序列化和URL编码,直接让RestSharp处理序列化:
using RestSharp; using RestSharp.Extensions; // 初始化客户端时传入基础URL var client = new RestClient("http://localhost:60484"); var request = new RestRequest("/api/db", Method.Post); // 直接传入对象,RestSharp会自动序列化为JSON并设置正确的Content-Type request.AddJsonBody(parmsDb); var response = client.Execute(request);
场景2:直接传递字符串
使用AddStringBody方法,明确指定媒体类型为application/json,确保请求体符合服务端预期:
using RestSharp; using RestSharp.Extensions; var client = new RestClient("http://localhost:60484"); var request = new RestRequest("/api/db", Method.Post); // 直接传入字符串,指定Content-Type为application/json request.AddStringBody("abcdefg", ContentType.Json); var response = client.Execute(request);
注意事项
- 移除手动
UrlEncode操作,RestSharp会自动处理URL和请求体的编码 - 确保引用
RestSharp.Extensions命名空间,否则AddJsonBody和AddStringBody可能无法使用 Method枚举值改为Method.Post(首字母小写)
内容的提问来源于stack exchange,提问作者polymechan
相关产品推荐
相关产品推荐

