【发布时间】:2014-11-16 22:08:03
【问题描述】:
我目前正在使用通过 HttpClient 类发出 HTTP 请求的代码。虽然您可以为请求指定超时时间,但该值适用于整个请求(包括解析主机名、建立连接、发送请求和接收响应)。
如果请求无法解析名称或建立连接,我需要一种方法使请求快速失败,但有时我还需要接收大量数据,因此不能仅仅减少超时。
有没有办法使用内置 (BCL) 类或替代 HTTP 客户端堆栈来实现此目的?
我已经简要地查看了 RestSharp 和 ServiceStack,但似乎都没有为连接部分提供超时(但如果我错了,请纠正我)。
【问题讨论】:
-
我不确定您是否看过以下内容,如果是,请忽略..HttpWebRequest.Timeout
-
@DJKRAZE HttpWebRequest 的超时“适用于整个请求和响应”(来自 MSDN 页面)。
-
在建立连接后更改超时值是一个选项吗?
-
你为什么不事先执行(异步)DNS解析,这是主要的错误?我也不会尝试单独在端口上建立连接——让常规超时来解决这个问题,因为好的防火墙与慢速服务器无法区分——但可以排除 DNS 解析。
-
"如果他们无法解析名称或建立连接" 这有两个部分 A) DNS 解析和 B) 打开到该端口的 Socket。没有 DNS 解析通常是因为 1) DNS 服务器或其其他邻居无法解析名称或 2) DNS 服务器已关闭。第二部分是发送套接字打开请求的愿望,这是端口扫描器所做的,它查看套接字(地址/端口对)是否正在响应。它只需通过 Socket.Open() 启动会话即可。客户端要么响应,要么不响应,如果你有 DNS 解析,它所花费的时间是最短的。
标签: c# httpwebrequest dotnet-httpclient