Подтвердить что ты не робот

Как проверить подключение к Интернету с .NET, С# и WPF

Я использую .NET, С# и WPF, и мне нужно проверить, открыто ли подключение к определенному URL-адресу, и я не могу получить какой-либо код для работы, который я нашел в Интернете.

Я пробовал:

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
    IAsyncResult result = socket.BeginConnect("localhost/myfolder/", 80, null, null);
    bool success = result.AsyncWaitHandle.WaitOne(3000, true);
    if (!success)
    {
        MessageBox.Show("Web Service is down!");
    }
    else
        MessageBox.Show("Everything seems ok");
}
finally
{
    socket.Close();
}

Но я всегда получаю сообщение, что все в порядке, даже если я отключу свой локальный сервер Apache.

Я также пробовал:

ing ping = new Ping();
PingReply reply;
try
{
    reply = ping.Send("localhost/myfolder/");
    if (reply.Status != IPStatus.Success)
        MessageBox.Show("The Internet connection is down!");
    else
        MessageBox.Show("Seems OK");
}
catch (Exception ex)
{
    MessageBox.Show("Error: " + ex.Message);
}

Но это всегда дает исключение (ping, похоже, работает только для pinging сервера, поэтому localhost работает, но localhost/myfolder/doesnt)

Пожалуйста, как проверить соединение, чтобы оно работало для меня?

4b9b3361

Ответ 1

В конце я использовал свой собственный код:

private bool CheckConnection(String URL)
{
    try
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
        request.Timeout = 5000;
        request.Credentials = CredentialCache.DefaultNetworkCredentials;
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();

        if (response.StatusCode == HttpStatusCode.OK)
            return true;
        else
            return false;
    }
    catch
    {
        return false;
    }
}

Интересно, что, когда сервер выключен (я отключил свой Apache), я не получаю никакого HTTP-статуса, но генерируется исключение. Но это работает достаточно хорошо:)

Ответ 2

Многие разработчики решают эту "проблему" только посредством ping-ing Google.com. Что ж...?:/Это будет работать в большинстве (99%) случаев, но как профессионал должен полагаться на работу вашего приложения на каком-либо внешнем веб-сервисе?

Вместо того, чтобы пинговать Google.com, есть очень интересная функция Windows API под названием InternetGetConnectedState(), которая распознает, имеете ли вы доступ к Интернету или нет.

РЕШЕНИЕ для этой ситуации:

using System;
using System.Runtime;
using System.Runtime.InteropServices;
 
public class InternetAvailability
{
    [DllImport("wininet.dll")]
    private extern static bool InternetGetConnectedState(out int description, int reservedValue);
 
    public static bool IsInternetAvailable( )
    {
        int description;
        return InternetGetConnectedState(out description, 0);
    }
}

Ответ 3

Используйте это:

private bool CheckConnection()
{
    WebClient client = new WebClient();
    try
    {
        using (client.OpenRead("http://www.google.com"))
        {
        }
        return true;
    }
    catch (WebException)
    {
        return false;
    }
}

Ответ 4

Вы можете попробовать это:

private bool CheckNet()
{
    bool stats;
    if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable() == true)
    {
        stats = true;
    }
    else
    {
        stats = false;
    }
    return stats;
}

Ответ 5

Я думаю, что это будет более точно, когда появятся приложения для Windows, форма Windows или приложения WPF, вместо использования WebClient или HttpWebRequest,

public class InternetChecker
{
    [System.Runtime.InteropServices.DllImport("wininet.dll")]
    private extern static bool InternetGetConnectedState(out int Description, int ReservedValue);

    //Creating a function that uses the API function...
    public static bool IsConnectedToInternet()
    {
        int Desc;
        return InternetGetConnectedState(out Desc, 0);
    }

}

При вызове write

if(InternetCheckerCustom.CheckNet())
{
  // Do Work 
}
else
{
  // Show Error MeassgeBox 
}