C# HttpWebRequest调用长耗时API超时无响应如何解决?
C#调用长耗时API超时问题解决
问题背景
我需要从API获取字符串,编写了如下代码:
public string Get() { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Timeout= timeOut; request.ReadWriteTimeout = timeOut; using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) using (Stream stream = response.GetResponseStream()) using (StreamReader reader = new StreamReader(stream)) { return reader.ReadToEnd(); } }
我设置的timeout为20分钟(20*60000ms)。当API处理耗时约5分钟时,代码运行正常,可以正常拿到返回结果。
但当API处理耗时更长,约12分钟时就会出现问题:在Chrome浏览器中调用该API,12分钟后可以正常拿到结果,但使用C#程序调用相同API时无任何返回,即便API仅需12分钟就能处理完成,程序最终还是会在20分钟时抛出超时错误。
替换使用HttpClient替代HttpWebRequest时也出现了相同的问题。
问题原因
该问题是因为遗漏了ContinueTimeout参数的配置。该参数控制客户端发送带Expect: 100-continue头的请求后,等待服务端返回100 Continue响应的时长,默认值远低于20分钟。当API处理时间较长、服务端没有及时返回100 Continue响应时,客户端会一直阻塞等待,直到触发你配置的整体20分钟超时。
解决方案
在初始化HttpWebRequest时,额外配置ContinueTimeout参数即可,代码如下:
request.ContinueTimeout = timeOut;
配置后程序可正常调用12分钟耗时的API,不会再出现超时问题。
内容的提问来源于stack exchange,提问作者rozx
相关产品推荐
相关产品推荐

