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

el_*_*yan 12 c# httpwebrequest async-await

当我尝试以下代码时:

var request = (HttpWebRequest)HttpWebRequest.Create(url);
request.Timeout = 3; // a small value

var response = request.GetResponse();
Console.WriteLine(response.ContentLength);
Run Code Online (Sandbox Code Playgroud)

为此,我知道这是要采取超过3毫秒加载URL(我把Thread.Sleep(110000)Application_BeginRequest),它工作正常,并抛出一个WebException预期.

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

var response = request.GetResponseAsync().Result;
Run Code Online (Sandbox Code Playgroud)

要么

var response = await request.GetResponseAsync();
Run Code Online (Sandbox Code Playgroud)

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

我在MSDN中找不到关于Timeout的任何内容GetResponseAsync()现在我想知道它是否是一个错误GetResponseAsync()或者我在这里使用异步的方式有什么问题?

Ste*_*ary 18

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

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

我建议您使用HttpClient,而设计时考虑了异步请求.

  • "Timeout属性对使用BeginGetResponse或BeginGetRequestStream方法进行的异步请求没有影响.**":docs与GetResponseAsync无关,但无论如何答案都是正确的,因为GetResponseAsync使用了BeginGetResponse. (4认同)