HttpWebRequest.GetResponse()与GetResponseAsync()中的超时行为

本文关键字:超时 GetResponseAsync GetResponse HttpWebRequest | 更新日期: 2023-09-27 18:25:37

当我尝试以下代码时:

var request = (HttpWebRequest)HttpWebRequest.Create(url);
request.Timeout = 3; // a small value
var response = request.GetResponse();
Console.WriteLine(response.ContentLength);

对于我知道需要3毫秒以上才能加载的URL(我在Application_BeginRequest中放入了一个Thread.Sleep(110000)),它运行良好,并按预期抛出一个WebException

问题是当我切换到异步方法时:

var response = request.GetResponseAsync().Result;

var response = await request.GetResponseAsync();

此异步版本完全忽略任何超时值,包括ReadWriteTimeoutServicePoint.MaxIdleTime

我在MSDN的GetResponseAsync()中找不到任何关于Timeout的信息,现在我想知道这是GetResponseAsync()中的错误,还是我在这里使用async的方式有问题?

HttpWebRequest.GetResponse()与GetResponseAsync()中的超时行为

Timeout不适用于异步HttpWebRequest请求。引用文档:

Timeout属性对异步请求没有影响

我建议您改用HttpClient,它在设计时考虑到了异步请求。

遵循解决方案来解决问题。

await Task.Run(() => { 
  var varHttpResponse = varWebRequest.GetResponse(); 
});