Как проверить подключение к Интернету с .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)
Пожалуйста, как проверить соединение, чтобы оно работало для меня?
Ответы
Ответ 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
}