Какой лучший способ обнаружить подключение к Интернету с помощью .NET? - PullRequest
4 голосов
/ 28 декабря 2008

У меня есть приложение Windows Forms. Когда пользователь импортирует лицензию для моего приложения, я хотел бы «позвонить домой» (перейти на страницу aspx в Интернете) и зарегистрировать информацию о лицензии.

Проблема в том, что в данный момент у пользователя может не работать интернет-соединение. Я хотел бы проверить это первым. Как лучше всего определить, есть ли у пользователя доступ к интернету?

Ответы [ 7 ]

11 голосов
/ 28 декабря 2008

На PPOE на этот вопрос было потрачено не менее ста тысяч долларов. Основные точки прилипания:

  1. В большинстве случаев HTTP-соединение будет разорвано и получит сообщение «200 OK». Только это не твой сайт; Это отель / кафе / любой маршрутизатор, предлагающий подключить вас.

  2. API будут лежать интересным и креативным способом. Например, некоторые сетевые API-интерфейсы Windows возвращают неверные данные о соединении, если вы использовали модем, но затем обновили его до DSL, но не запустили мастер.

  3. В некоторых (очень важных) местах при попытке подключения начнется подключение - при подключении - с поминутной оплатой. Опять же, в PPOE они отправили довольно популярное программное обеспечение, которое сделало это в 3:00 утра. Сделано для некоторых серьезно раздражительных клиентов.

  4. Некоторые крупные интернет-провайдеры имеют «уникальное» программное обеспечение при работе в широкополосной сети, где они не были достаточно умны, чтобы просто использовать прекрасный Ethernet и TCP / IP, которые им предоставляются. Вместо этого они используют Ethernet для эмуляции модема (который, в свою очередь, настроен на эмуляцию настройки Ethernet + tcp / ip). Он называется PPPOE, и ему сложно определить, какой адаптер вы пытаетесь использовать

  5. Все больше домов используют модемы DSL и Cabel, где компьютер «подключен», но только к локальной коробке; локальный ящик может потерять связь, и вы никогда не узнаете.

ЕДИНСТВЕННОЕ РЕШЕНИЕ - попытаться установить соединение и подтвердить возврат.

8 голосов
/ 28 декабря 2008

Проверьте 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);
}
3 голосов
/ 28 декабря 2008

Я не вижу никаких преимуществ в тестировании, если соединение доступно до выполнения запроса. После проверки соединение может прерваться, и нет надежного способа определить, будет ли ваш запрос работать, прежде чем вы его попробуете. Я также не вижу никаких преимуществ для пользователя.

Единственный допустимый тест, который я бы увидел, - это наличие доступных сетевых интерфейсов, чтобы не раздражать пользователя вызовом удаленного доступа, если он все еще находится на удаленном соединении.

1 голос
/ 28 декабря 2008

Один из методов, который я использовал, - это создание веб-сервиса с логическим методом, который всегда возвращает «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;
        }
1 голос
/ 28 декабря 2008

Определите «подключение к интернету». Для меня нет «подключения к интернету». Есть только TCP / IP-соединения, DNS-серверы и веб-серверы и т. Д. Лучшее, что вы можете сделать, это попробовать загрузить веб-страницу и посмотреть, работает ли она. Как и предполагалось, вы можете попытаться пропинговать себя, но это не означает, что веб-сервер запущен или что страница может быть загружена. Вы можете быть в этом уверены только тогда, когда действительно загружаете страницу.

1 голос
/ 28 декабря 2008

Вы можете отправить пинг на "домашний" хост, чтобы узнать, возвращает ли он ответ.

Net :: Ping

0 голосов
/ 28 декабря 2008

Когда мне всегда нужно было проверять наличие интернет-соединений в моем приложении, я просто пинговал google.com, так как он никогда не выключался.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...