目标如下,发送请求并接收数据(我们省略接收数据)
如果计算机上没有 Internet,则显示有关此的错误
如果互联网可用但很弱,则获取超时并显示它
这个想法很简单...
namespace WebClientTest
{
internal class Program
{
static void Main(string[] args)
{
HttpWebRequest httpWebRequest;
HttpWebResponse httpResponse = null;
try
{
httpWebRequest = (HttpWebRequest)WebRequest.Create("http://8.8.8.8/");
httpWebRequest.Method = "POST";
httpWebRequest.Timeout = 30000;
httpWebRequest.ContinueTimeout = 10000;
try
{
httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
}
catch (WebException ex)
{
Console.WriteLine("WebException: " + ex.Status.ToString());
Console.WriteLine("WebException: " + ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadLine();
}
}
}
我关闭了网络适配器,20 秒后出现 WebException 问题:
WebException:连接失败
WebException:无法连接到远程服务器如果我将速度限制在最低限度,我会得到相同的结果
来自这里的问题
当超时时间长达 30 秒时,为什么在 20 秒后发生 ConnectFailure?
如果速度仅限于 64kb 及以下,为什么还要使用 ConnectFailure?根据想法应该有一个超时
是否甚至可以在不求助于第三方库并 ping 同一个 Google 的情况下区分没有 Internet 和连接不良?
PS 如果你指定的超时时间小于 20 秒,那么正好在两种情况下,没有互联网或连接不良
最后,我想看看:
如果没有互联网连接失败
互联网超时有限
HttpWebRequest已经如此古老,以至于它早已死亡、埋葬和腐烂。把它埋回去,重新开始。您对过时且有轻微故障的客户端的问题没有多大意义,因为它本身已经无关紧要。从 .NET Framework 4.5 开始,您应该使用现代HttpClient 进行网络连接。虽然我给你的建议是,如果你真的需要一个古老的框架,那么就不要使用 4.6 之前的版本,老版本与互联网不兼容,为了让它们工作,你必须拄拐杖,但它是最好使用 4.7.2 和更新版本。
POST请求必须包含一个body,也就是内容,需要写的代码很大程度上取决于这个内容的类型,但是这里给你留个空白。让它成为一些要发送的文本,比如 JSON。
(几乎不记得它是如何用旧的 C# 7.x 编写的)
并且不要为超时而烦恼。首先,熟悉工作模式下的工具。好吧,学习异步编程。
顺便说一句,.NET 4.x 也已经过时了。另一个有用的效果是,如果你切换到现代 dotnet,它
HttpClient会突然开始支持 HTTP/2 和其他现代好东西,而且运行速度会更快。从 .NET Core 3.1 开始,它有一个从头开始重写的新网络引擎。