.NET、C#、および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はサーバーへのpingのみで機能するように見えるため、localhostは機能しますがlocalhost/myfolder /は機能しません)
それが私のために働くように接続をチェックする方法を教えてください?
最後に私は自分のコードを使用しました:
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ステータスが取得されないのに、例外がスローされることです。しかし、これは十分に機能します:)
多くの開発者は、Google.comにpingを実行するだけでその「問題」を解決しています。上手...? :/それはほとんど(99%)のケースで動作しますが、外部Webサービスでアプリケーションの動作を信頼するのはどの程度プロフェッショナルですか?
Google.comにpingする代わりに、
InternetGetConnectedState()
と呼ばれる非常に興味深いWindows API関数があり、これはあなたがインターネットにアクセスできるかどうかを認識します。
THE SOLUTIONこの状況の場合:
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);
}
}
これを使って:
private bool CheckConnection()
{
WebClient client = new WebClient();
try
{
using (client.OpenRead("http://www.google.com"))
{
}
return true;
}
catch (WebException)
{
return false;
}
}
これを試すことができます。
private bool CheckNet()
{
bool stats;
if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable() == true)
{
stats = true;
}
else
{
stats = false;
}
return stats;
}
これは、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);
}
}
書き込みを呼び出している間
if(InternetCheckerCustom.CheckNet())
{
// Do Work
}
else
{
// Show Error MeassgeBox
}
私はすべての解決策を検討しました。 NetworkInterface.GetIsNetworkAvailable()
はインターネット接続をチェックしません。ネットワーク接続が利用可能かどうかを確認するだけです。
Ping
は、多くのネットワークでpingがオフになっているため、信頼できません。 webclientでgoogleに接続することも100%信頼できるわけではなく、頻繁に使用するとパフォーマンスのオーバーヘッドも発生します。
Windows NLM API
を使用することは、私にとって素晴らしい解決策のようです。
using NETWORKLIST;
namespace Network.Helpers
{
public class InternetConnectionChecker
{
private readonly INetworkListManager _networkListManager;
public InternetConnectionChecker()
{
_networkListManager = new NetworkListManager();
}
public bool IsConnected()
{
return _networkListManager.IsConnectedToInternet;
}
}
}
これがプロジェクトに追加する方法です。
質問するだけでpingを使用できますか?
try
{
System.Net.NetworkInformation.Ping ping = new Ping();
PingReply result = ping.Send("www.google.com");
if (result.Status == IPStatus.Success)
return true;
return false;
}
catch
{
return false;
}