升级RestSharp到106.12.0版本后返回Internal Server Error如何处理
RestSharp版本升级后请求报错问题及解决方案
问题复现
原有基于RestSharp 106.2.2版本编写的请求代码可正常运行,升级到106.12.2版本后,相同代码返回500内部服务错误。
原正常运行代码
string endpoint = "https://api.xyz.com/api/TestControl/TestMethod?isActive=True&$top=50000&$skip=0"; RestRequest request = new RestRequest(); request.AddHeader("Content-Type", "application/json"); request.AddHeader( "Authorization", string.Format( CultureInfo.InvariantCulture, "{0} {1}", HttpClient.DefaultRequestHeaders.Authorization.Scheme, HttpClient.DefaultRequestHeaders.Authorization.Parameter)); RestClient client = new RestClient { BaseUrl = new Uri(endpoint), }; IRestResponse<T> response = client.Execute<T>(request); return response.Data;
服务端返回错误信息
{"$type":"ApiExceptionDto","correlationId":"8a541e5b-fa49-41d4-b2ec-671461fb1f91","developerException":null,"userException":{"$type":"ApiDetailExceptionDto","type":"SimpleException","detail":"Index must be within the bounds of the List.\r\nParameter name: index"}}
问题原因
该问题由RestSharp 106.3版本之后的URL拼接逻辑变更导致:
- 原有写法将完整带查询参数的请求地址直接赋值给
BaseUrl,同时RestRequest未指定资源路径 - 新版本处理该场景时,会错误的在
BaseUrl末尾拼接多余符号,最终发出的请求URL格式异常,导致服务端解析查询参数时触发索引越界异常 - 部分小版本还存在空资源路径下内部处理查询参数集合时的客户端侧索引越界bug,也会触发同类错误
修复方案
方案1(推荐):拆分BaseUrl与资源路径
遵循RestSharp的设计规范,BaseUrl仅填写服务根地址,资源路径和查询参数通过RestRequest传入:
RestClient client = new RestClient { BaseUrl = new Uri("https://api.xyz.com/"), }; // 资源路径和查询参数放入RestRequest构造参数,显式指定请求方法 RestRequest request = new RestRequest("api/TestControl/TestMethod?isActive=True&$top=50000&$skip=0", Method.GET); // 剩余Header添加逻辑保持不变,注意无需手动添加Content-Type头,RestSharp会自动根据请求内容生成
方案2:直接将完整地址传入RestRequest
无需拆分地址,直接把完整请求路径赋值给RestRequest的Resource参数,RestClient无需设置BaseUrl:
RestClient client = new RestClient(); RestRequest request = new RestRequest(endpoint, Method.GET);
方案3(兼容原有写法):显式指定空资源路径与请求方法
如果不想调整原有URL赋值逻辑,可在初始化RestRequest时显式指定请求方法和空字符串作为资源路径,绕过拼接逻辑bug:
RestRequest request = new RestRequest("", Method.GET);
内容的提问来源于stack exchange,提问作者Swaroop
相关产品推荐
相关产品推荐

