使用.NET检测互联网连接的最佳方法是什么?

时间:2008-12-28 15:34:34

标签: .net winforms connection

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

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

7 个答案:

答案 0 :(得分:11)

在PPOE上,至少有十万美元花在这个问题上。主要观点:

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

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

  3. 在某些(非常重要的)地方,尝试连接将启动连接 - 拨号 - 每分钟收费。再次,在PPOE上他们发布了一个相当受欢迎的软件,它在凌晨3点完成了这项工作。为一些严重脾气暴躁的顾客而制作。

  4. 一些主要的互联网服务提供商在宽带上运行时拥有“独特”软件,而这些软件并不够聪明,只能使用它们所提供的优质以太网和TCP / IP。相反,他们使用以太网来模拟调制解调器(后者又设置为模拟以太网+ tcp / ip设置)。它被称为PPPOE,它很难分辨出你想要使用的适配器

  5. 越来越多的家庭使用DSL和Cabel调制解调器,计算机处于“连接”状态,但仅限于本地盒子;本地方框可能已失去连接,你永远不会知道。

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

答案 1 :(得分:8)

检查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 :(得分:3)

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

我会看到的唯一合法测试是,是否有任何可用的网络接口,以避免用户拨打拨号提示,以防他/她仍处于拨号连接。

答案 3 :(得分:1)

您可以向“主”主机发出ping命令,看它是否会返回回复。

Net::Ping

答案 4 :(得分:1)

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

答案 5 :(得分:1)

我使用的一种方法是使用一个总是返回“true”的布尔方法创建一个web服务。从你的应用程序中调用它,如果你有任何例外或“假”,你就没有连接。

    [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;
        }

答案 6 :(得分:0)

当我总是需要检查我的应用中的互联网连接时,我会ping google.com,因为它接缝永远不会停止。