【问题标题】:What's the best way to detect an internet connection using .NET?使用 .NET 检测 Internet 连接的最佳方法是什么?
【发布时间】:2023-03-17 04:45:01
【问题描述】:

我有一个 Windows 窗体应用程序。当用户为我的应用程序导入许可证时,我想“打电话回家”(点击网络上的 aspx 页面)并注册许可证信息。

问题是用户当时可能没有互联网连接。我想先测试一下。检测用户是否有可用的互联网连接的最佳方法是什么?

【问题讨论】:

    标签: .net winforms connection


    【解决方案1】:

    检查WebRequest.GetResponse方法

    // Create a new WebRequest Object to the mentioned URL.
    WebRequest myWebRequest=WebRequest.Create("http://www.contoso.com");
    Console.WriteLine("\nThe Timeout time of the request before setting is : {0} milliseconds",myWebRequest.Timeout);
    
    // Set the 'Timeout' property in Milliseconds.
    myWebRequest.Timeout=10000;
    
    // This request will throw a WebException if it reaches the timeout limit before it is able to fetch the resource.
    WebResponse myWebResponse=myWebRequest.GetResponse();
    

    或者您可以调用 InternetGetConnectedState API

    [DllImport("wininet.dll")]
    private extern static bool InternetGetConnectedState(out int Description, int ReservedValue ) ;
    
    public static bool IsConnectedToInternet()
    {
        int Desc ;
        return InternetGetConnectedState(out Desc, 0);
    }
    

    【讨论】:

      【解决方案2】:

      在 PPOE 上,至少在这个问题上花费了十万美元。主要症结:

      1. 很多时候,HTTP 连接会断开,然后返回“200 OK”消息。只是它不是您的网站;它是酒店/咖啡厅/任何提供连接您的路由器。

      2. API 将以有趣和创造性的方式存在。例如,如果您以前有调制解调器,但后来升级到 DSL,但没有运行向导,则某些 Windows 网络 API 会返回错误的连接数据。

      3. 在某些(非常重要的)地方,尝试连接会启动连接——在拨号时——按分钟收费。同样,在 PPOE,他们在凌晨 3:00 发布了一款相当受欢迎的软件。专为一些脾气暴躁的客户打造。

      4. 一些主要的 ISP 在宽带上运行时拥有“独特”的软件,但它们不够聪明,无法仅使用提供的良好以太网和 TCP/IP。相反,他们使用以太网来模拟调制解调器(而调制解调器又被设置为模拟以太网 +tcp/ip 设置)。它被称为 PPPOE,因此很难判断您尝试使用的适配器是什么

      5. 越来越多的家庭使用 DSL 和电缆调制解调器,其中计算机“连接”,但仅限于本地盒子;本地盒子可能已失去连接,而您永远不会知道。

      唯一的解决方案是尝试连接并验证返回。

      【讨论】:

        【解决方案3】:

        我使用的一种方法是创建一个带有布尔方法的 Web 服务,该方法总是返回“true”。从您的应用程序中调用它,如果您遇到任何异常或“错误”,则表示您没有连接。

            [WebMethod]
            public bool IsAvailable()
            {
                return true;
            }
        

        然后调用它:

                private bool IsOnline()
                {
                    Cursor = Cursors.WaitCursor;
                    var proxy = new WS();
                    bool IsOnline = false;
                    try
                    {
                        IsOnline = proxy.IsAvailable();
                    }
                    catch (System.Net.WebException WebEx)
                    {
                        NameValueCollection nvc = new NameValueCollection();
                        nvc.Add("WebException Status", WebEx.Status.ToString());
                        if (WebEx.Status == System.Net.WebExceptionStatus.ProtocolError)
                        {
                            nvc.Add("Status Code", ((System.Net.HttpWebResponse)WebEx.Response).StatusCode.ToString());
                            nvc.Add("Status Description", ((System.Net.HttpWebResponse)WebEx.Response).StatusDescription);
                        }
                        ExceptionManager.Publish(WebEx, nvc);
                    }
                    catch (Exception)
                    {
                        IsOnline = false;
                    }
                    Cursor = Cursors.Default;
                    return IsOnline;
                }
        

        【讨论】:

          【解决方案4】:

          当我总是需要在我的应用程序中检查互联网连接时,我只会 ping google.com,因为它永远不会关闭。

          【讨论】:

          • 我不建议这样做,因为像这样的硬编码可能会导致维护噩梦。如果 Google 突然决定屏蔽 icmp-echo-r​​equest 怎么办?
          【解决方案5】:

          在执行请求之前测试连接是否可用,我认为没有任何优势。在您检查后连接仍可能断开,并且在您尝试之前没有可靠的方法来判断您的请求是否有效。我也看不出对用户有任何好处。

          我会看到的唯一合法测试是是否有任何可用的网络接口,以避免在用户仍在拨号连接的情况下因拨号提示而惹恼用户。

          【讨论】:

            【解决方案6】:

            定义“互联网连接”。对我来说,没有“互联网连接”。只有 tcp/ip 连接、dns 服务器和 web 服务器等。你能做的最好的就是尝试加载网页,看看它是否有效。正如建议的那样,您可以尝试 ping 自己,但这并不意味着 Web 服务器正在运行,也不意味着可以加载页面。只有在实际加载页面时才能确定这一点。

            【讨论】:

              【解决方案7】:

              您可以向“家”主机发送一个 ping 指令以查看它是否返回回复。

              Net::Ping

              【讨论】:

              • 但是如果你不能 ping 这并不一定意味着你不能使用 HTTP(S) 连接。 (太多)许多防火墙阻止了 icmp-echo。
              猜你喜欢
              • 2011-01-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-03-29
              相关资源
              最近更新 更多