RestClient设置Request超时仍触发100秒HttpClient超时求助
我的代码片段截至昨天运行正常,但今早日志出现以下错误:
response.ErrorException = {"The request was canceled due to the configured HttpClient.Timeout of 100 seconds elapsing."}
明明我创建RestRequest时设置了另一超时时间,为什么错误里显示的是100秒超时?
代码如下:
var client = new RestClient(); client.Options.BaseUrl = new Uri(url); var request = new RestRequest("api/hello", Method.Get) { Timeout = (int)TimeSpan.FromSeconds(300000).TotalMilliseconds }; request.AddHeader("Authorization", "Bearer " + token); request.AddHeader("Content-Type", "application/json"); var response = await client.ExecuteAsync(request);
补充:使用RestClient 108.0.3版本。
核心原因
RestClient 10.x版本(含108.0.3)底层依赖HttpClient,而HttpClient默认全局超时为100秒。当RestRequest.Timeout设置的时长大于HttpClient的超时值时,实际生效的是HttpClient的100秒超时,这就是你看到错误提示的原因。
另外你的代码里还有个明显的数值错误:TimeSpan.FromSeconds(300000)等于300000秒(约5000分钟),这显然是不合理的超时设置,大概率是笔误(比如想设置30秒)。但即使数值合理,只要超过HttpClient的100秒默认限制,依然会触发100秒超时。
解决办法
同步调整HttpClient和RestRequest的超时值
初始化RestClient时,通过RestClientOptions设置全局超时,确保它大于或等于RestRequest的超时:// 示例:设置全局超时为30秒,同时修正Request的超时值 var client = new RestClient(new RestClientOptions(url) { Timeout = (int)TimeSpan.FromSeconds(30).TotalMilliseconds }); var request = new RestRequest("api/hello", Method.Get) { Timeout = (int)TimeSpan.FromSeconds(30).TotalMilliseconds };若需超长超时,需同时设置HttpClient为无限超时
如果确实需要超过100秒的超时,要将HttpClient的超时设为无限,再设置RestRequest的具体超时:var client = new RestClient(new RestClientOptions(url) { Timeout = -1 // 对应无限超时 }); var request = new RestRequest("api/hello", Method.Get) { Timeout = (int)TimeSpan.FromMinutes(10).TotalMilliseconds // 比如10分钟 };
内容的提问来源于stack exchange,提问作者Paul Viorel

