"The request was aborted: The request was canceled." 的 WebException 的根本原因是什么?

4
我正在使用 HttpClient 进行 Http 请求。偶尔会出现以下错误:

异常类型:System.Net.WebException
错误信息:请求被中止:请求被取消。
在 System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult) 中抛出
在 System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar) 中抛出
异常类型:System.Net.Http.HttpRequestException
错误信息:发送请求时发生错误。

我试图了解根本原因可能是什么。在 StackOverflow 上有很多关于这个消息的帖子(例如这篇帖子),但所有的帖子似乎都与寻找解决方法有关(通常是像将 KeepAlive 设置为 false 这样的事情,而这不是我想要的),我只是想了解这个错误真正意味着什么,以便我可以决定是否需要采取措施。

这意味着在发出请求的HttpWebRequest(可能)在GetResponseAsync的异步阶段期间调用了HttpWebRequest.Abort,或者是由于提供给GetResponseAsync的CancellationToken发出了取消信号...也许是通过具有超时的CancellationTokenSource。这可能是一个超时吗? - spender
你可以在这里阅读 HttpClient 的源代码:https://github.com/dotnet/corefx/tree/master/src/System.Net.Http/src/System/Net/Http。 - spender
1个回答

1
没有人能确定。
启用网络客户端跟踪可以帮助检测根本原因。
注意:
该文档定义了5个跟踪源,但在System.Net的Logging类中有6个。
s_WebTraceSource = new NclTraceSource("System.Net");
s_HttpListenerTraceSource = new NclTraceSource("System.Net.HttpListener"); // not in the documentation
s_SocketsTraceSource = new NclTraceSource("System.Net.Sockets");
s_WebSocketsTraceSource = new NclTraceSource("System.Net.WebSockets");
s_CacheTraceSource = new NclTraceSource("System.Net.Cache");
s_TraceSourceHttpName = new NclTraceSource("System.Net.Http");

当全部5个启用时的示例日志:

System.Net Verbose: 0 : [9520] WebRequest::Create(http://localhost:9876/)
System.Net Verbose: 0 : [9520] HttpWebRequest#58870012::HttpWebRequest(http://localhost:9876/#363619410)
System.Net Information: 0 : [9520] Current OS installation type is 'Client'.
System.Net Information: 0 : [9520] RAS supported: True
System.Net Verbose: 0 : [9520] Exiting HttpWebRequest#58870012::HttpWebRequest() 
System.Net Verbose: 0 : [9520] Exiting WebRequest::Create()     -> HttpWebRequest#58870012
System.Net Verbose: 0 : [9520] HttpWebRequest#58870012::GetResponse()
System.Net Verbose: 0 : [9520] ServicePoint#33675143::ServicePoint(localhost:9876)
System.Net Information: 0 : [9520] Associating HttpWebRequest#58870012 with ServicePoint#33675143
System.Net Information: 0 : [9520] Associating Connection#34640832 with HttpWebRequest#58870012
System.Net.Sockets Verbose: 0 : [9520] Socket#43332040::Socket(AddressFamily#2)
System.Net.Sockets Verbose: 0 : [9520] Exiting Socket#43332040::Socket() 
System.Net.Sockets Verbose: 0 : [9520] Socket#54444047::Socket(AddressFamily#23)
System.Net.Sockets Verbose: 0 : [9520] Exiting Socket#54444047::Socket() 
System.Net.Sockets Verbose: 0 : [9520] DNS::TryInternalResolve(localhost)
System.Net.Sockets Verbose: 0 : [9520] Socket#43332040::Connect(127.0.0.1:9876#16787179)
System.Net.Sockets Error: 0 : [9520] Socket#43332040::UpdateStatusAfterSocketError() - ConnectionRefused
System.Net.Sockets Error: 0 : [9520] Exception in Socket#43332040::Connect - No connection could be made because the target machine actively refused it 127.0.0.1:9876.
System.Net.Sockets Verbose: 0 : [9520] Socket#43332040::Dispose()
System.Net.Sockets Verbose: 0 : [9520] Socket#54444047::Dispose()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接