基本的にFTPプロトコルを介して(を使用して)ファイルをアップロードするC#コードがありますFtpWebRequest
。ただし、ファイルをアップロードする前に、インターネット接続が機能しているかどうかを最初に確認したいと思います(試行しても意味がない場合、ソフトウェアはしばらくスリープしてからもう一度確認する必要があるため) 。
それを行う簡単な方法はありますか、それともファイルをアップロードしてみて、失敗した場合はネットワーク接続がダウンしていると仮定して再試行する必要がありますか?
基本的にFTPプロトコルを介して(を使用して)ファイルをアップロードするC#コードがありますFtpWebRequest
。ただし、ファイルをアップロードする前に、インターネット接続が機能しているかどうかを最初に確認したいと思います(試行しても意味がない場合、ソフトウェアはしばらくスリープしてからもう一度確認する必要があるため) 。
それを行う簡単な方法はありますか、それともファイルをアップロードしてみて、失敗した場合はネットワーク接続がダウンしていると仮定して再試行する必要がありますか?
プレーン関数を使用するだけです
System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()
接続が確立している場合は、trueまたはfalseを返します。
MSDNから: ネットワークインターフェイスが「アップ」とマークされていて、ループバックまたはトンネルインターフェイスではない場合、ネットワーク接続は使用可能であると見なされます。
接続がすべてではないことに注意してください。たとえば、ローカルネットワークに接続でき、ルーターはインターネットに接続されていません。インターネットに接続しているかどうかを実際に知るには、Pingクラスを試してください。
トンネルまたはループバックではないインターフェイスでネットワーク接続の「アップ」状態が変化したときに発生する「ネットワーク可用性が変更されました」イベントがあります。
起動時にシステム上のすべてのネットワークアダプタの状態を読み取り、「ネットワークが利用可能」の現在の値を保存してから、このイベントをリッスンし、このイベントが発生したときにネットワーク状態変数を変更できます。これは、ダイヤルアップ接続とISDN接続も処理するようにも見えます。
NICがルーターに接続されている(そして機能している)が、ルーターのインターネット接続がダウンしている、リモートホストが応答していないなど、考慮すべき他の要因があることは確かですが、これにより、少なくとも最初にネットワーク接続がない場合(VPNまたはISDNリンクがダウンしている場合など)は機能しない接続を確立します。
これはC#コンソールアプリケーションです-実行を開始してから、ネットワーク接続を無効にするか、プラグを抜いてください:-)
class Program
{
static bool networkIsAvailable = false;
static void Main(string[] args)
{
NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface nic in nics)
{
if (
(nic.NetworkInterfaceType != NetworkInterfaceType.Loopback && nic.NetworkInterfaceType != NetworkInterfaceType.Tunnel) &&
nic.OperationalStatus == OperationalStatus.Up)
{
networkIsAvailable = true;
}
}
Console.Write("Network availability: ");
Console.WriteLine(networkIsAvailable);
NetworkChange.NetworkAvailabilityChanged += new NetworkAvailabilityChangedEventHandler(NetworkChange_NetworkAvailabilityChanged);
Console.ReadLine();
}
static void NetworkChange_NetworkAvailabilityChanged(object sender, NetworkAvailabilityEventArgs e)
{
networkIsAvailable = e.IsAvailable;
Console.Write("Network availability: ");
Console.WriteLine(networkIsAvailable);
}
}
使用できる最善の近似は、タイプのOperationalStatus
値を確認することだと思います。NetworkInterface
using System.Net.NetworkInformation;
public bool IsNetworkLikelyAvailable() {
return NetworkInterface
.GetAllNetworkInterfaces()
.Any(x => x.OperationalStatus == OperationalStatus.Up);
}
これは概算ですが、覚えておいてください。このメソッドが戻った瞬間に、コンピューターはインターネット接続を失ったり、獲得したりする可能性があります。IMOアップロードが発生しないことを証明できないため、アップロードを直行してエラーを処理します。
チェックが戻って「接続があります」と表示され、FTPを開始する前に、接続が切断される状況を考えてみてください。
または、FTPリクエストの途中で接続が切断された場合。
とにかくこれらの状況のためにコーディングする必要があることを考えると、チェックをスキップするだけです
ジェイソンのコメントに応じて編集する
また、逆の状態が発生する可能性もあります。接続を確認すると、何も存在しませんが、しばらくすると接続が確立されます。では、今、あなたは何をしますか?接続が利用可能になったとしても、接続がないことについてユーザーを悩ませ始めますか?
結局のところ、あなたは多数のリソース(ネット接続、中間ルーター、ホスト、そのFTPサービス)を扱っています。これらはすべて(Sethのコメントが示すように)あなたの管理外で変更される可能性があり、「このアップロードを完了できるか」という質問に事前テストを行っても答えられませんか?
OPは、彼が「バックオフして後で再試行する」アプローチを考えていることを示したので、「不合理な」ことを試みていない限り、すべてをバックグラウンドで実行し、ユーザーをまったく煩わせないことが適切だと思います。 「成功しなかった時間。
ファイルをアップロードする前に、System.Net.NetworkInformation名前空間のPingクラスを使用してFTPサーバーにpingを実行することはできませんか?
pingが難しい場合は、webclientを使用してください。
public static bool CheckForInternetConnection()
{
try
{
using (var client = new WebClient())
using (var stream = client.OpenRead("http://www.google.com"))
{
return true;
}
}
catch
{
return false;
}
}
または他のサイト。編集:このサイトはhttp://www.msftncsi.com/を使用できます。これはインターネット接続のためだけに運営されているサイトです。Windows7がインターネット接続を検出する方法の詳細なレジストリの説明を参照してくださいhttp://blog.superuser.com/2011/05/16/windows-7-network-awareness/
それを行うために非同期関数を書いただけです:
private void myPingCompletedCallback(object sender, PingCompletedEventArgs e)
{
if (e.Cancelled)
return;
if (e.Error != null)
return;
if (e.Reply.Status == IPStatus.Success)
{
//ok connected to internet, do something...
}
}
private void checkInternet()
{
Ping myPing = new Ping();
myPing.PingCompleted += new PingCompletedEventHandler(myPingCompletedCallback);
try
{
myPing.SendAsync("google.com", 3000 /*3 secs timeout*/, new byte[32], new PingOptions(64, true));
}
catch
{
}
}