RestSharp请求返回Invalid JSON字符串与Not Acceptable状态码排查求助
一、查看原始响应内容,确认是否为响应问题
要绕过自动反序列化查看服务器返回的原始内容,你可以暂时改用非泛型的Execute方法,直接获取响应的原始文本:
// 替换原泛型执行逻辑,先获取原始响应 var rawResponse = client.Execute(request); // 输出或记录原始内容、状态码、ContentType Debug.WriteLine("原始响应内容:" + rawResponse.Content); Debug.WriteLine("响应状态码:" + rawResponse.StatusCode); Debug.WriteLine("响应ContentType:" + rawResponse.ContentType);
这样就能看到服务器实际返回的内容——如果是406状态码,服务器大概率返回的是HTML错误页、纯文本提示而非JSON,这时候强制反序列化自然会抛出"Invalid JSON string"异常。
二、你的代码中的几个潜在问题
多余的
RequestFormat设置
GET请求没有请求体,request.RequestFormat = DataFormat.Json;完全没必要,反而可能让请求带上不必要的Content-Type头,干扰服务器判断,直接删掉即可。强制修改响应ContentType会掩盖真实问题
request.OnBeforeDeserialization = respons => respons.ContentType = "application/json";会强制把响应的ContentType改成JSON,哪怕服务器返回的是其他格式(比如406对应的错误内容)。RestSharp会基于这个强制设置去反序列化非JSON内容,直接触发"Invalid JSON string"异常,必须删掉这行。缺少
Accept请求头(406状态码的核心原因)
服务器返回"Not Acceptable"(406),通常是因为客户端未明确告知服务器自己接受的响应格式。你需要添加Accept头,明确要求JSON格式:
request.AddHeader("Accept", "application/json");
这是解决406状态码的关键步骤。
- 异步代码写法冗余
你用Task.Run包裹client.Execute<T>再加ContinueWith的写法过于绕,RestSharp本身提供异步方法ExecuteAsync<T>,可以简化为:
var response = await client.ExecuteAsync<T>(request);
如果必须使用同步等待,也可以简化逻辑,避免不必要的任务嵌套。
调整后的核心代码示例
var client = new RestClient(base_Url.BaseURL); var request = new RestRequest(endPoint, Method.GET); // 添加Accept头,明确请求JSON响应 request.AddHeader("Accept", "application/json"); // 使用认证器添加Bearer token client.Authenticator = new OAuth2AuthorizationRequestHeaderAuthenticator(accessToken, "Bearer"); // 调试阶段先查看原始响应 var rawResponse = client.Execute(request); Debug.WriteLine(rawResponse.Content); // 正式请求(调试完成后可保留) var response = client.Execute<T>(request);
内容的提问来源于stack exchange,提问作者High Plains Grifter

