背景を少々。私は、グローバル WAN を持つ企業で働いています。外部ユーザーは VPN 経由で接続し、電子メールや共有ネットワーク ディレクトリにアクセスするには接続する必要があります。
ClickOnce を使用して Web サイトから公開およびインストールされる .Net アプリケーションがあります。会社で働いているユーザーもそうでないユーザーも、このアプリケーションにアクセスでき、Web サーバーにも公開されている Web サービスに要求を送信します。
この質問の範囲外の理由により、ユーザーがアプリケーションにログインしようとすると、サーバーのコンピューター名を明示的に参照して Web サービス サーバーに接続する必要があります (つまり、http://**server**/webservice/ws.asmx
.) ユーザーが WAN に接続されていない場合、彼らは私たちのウェブアドレスからアクセスする必要があります(つまりhttps://**www.companywebsite.com**/webservice/ws.asmx
.)
Web サービスに関連付けられた URL を動的に設定する方法を知っています。私の問題は、WAN 接続をテストするための、高速で信頼性が高く、簡単な方法が思いつかないことです。
Ping
最初に、かなり短いタイムアウトで(.Net クラスを使用して) ping 要求をサーバーに送信しようとしました。ただし、WAN に接続されていないときにサーバーに対して ping 操作を呼び出すと、次のような例外が返されます。
Ping 要求中に例外が発生しました。
以下は、WAN 接続をテストするプロパティに関連付けられたコードです。簡単ですが、ネットワークからこれをテストすると、上記のメッセージが表示され続けます。
public static bool ConnectedToWAN
{
get
{
try
{
Ping ping = new Ping();
PingReply reply = ping.Send("server", 2000);
return reply.Status == IPStatus.Success;
}
catch (Exception e)
{/* ' An exeception occurred during the Ping request.' */};
}
取得している例外に基づいて接続状態を返さないことをお勧めします。むしろ、接続を検証できるネットワークを明示的に呼び出します。
1 つの簡単なメモ、ユーザーの IP を確認できません。一部のユーザーは、独自の WAN を持つ他の組織で働いています。.Net WinForms アプリケーション内で IP をチェックしているため、IP アドレスが WAN に関連付けられている可能性があります。代わりに、 WAN だけでなく、WAN に具体的に接続されているかどうかを確認する必要があります。
これどうやってするの?