4

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

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

4

7 回答 7

11

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

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

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

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

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

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

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

于 2008-12-28T15:58:14.857 回答
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);
}
于 2008-12-28T15:57:07.887 回答
3

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

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

于 2008-12-28T15:55:48.543 回答
1

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

网::平

于 2008-12-28T15:36:39.753 回答
1

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

于 2008-12-28T15:39:13.540 回答
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;
        }
于 2008-12-28T16:12:29.477 回答
0

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

于 2008-12-28T16:05:39.913 回答