1

背景を少々。私は、グローバル 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 に具体に接続されているかどうかを確認する必要があります。

これどうやってするの?

4

2 に答える 2

1

公共のアクセス可能なインターネットではなく、会社のネットワーク内に接続されている場合、ホスト名を解決する必要があると思います。

その場合は、DNS.BeginGetHostEntry と非同期メソッドを使用して、指定したホスト コンピューターのドメイン ネーム システムを取得できます。

例えば

var host = '**Internal Server Name**';
Boolean isWANConnected = false;
String ConnectMessage ;
AsyncCallback callBack = new AsyncCallBack(GetHostName);
Dns.BeginGetHostEntry(host, callBack, host);

static void GetHostName(IAsyncResult result)
{
  string hostname = (string)result.AsyncState;
  try
  {
     IPHostEntry host = Dns.EndGetHostEntry(result)
     ConnectMessage = host as String;
  }
  catch(SocketException e)
  {
    isWANConnected = false;
    ConnectMessage = e.Message;
  }
}
于 2012-07-18T17:46:32.647 に答える
1

WAN 上にないユーザーはそのサーバー IP を解決できますか? そうでない場合は、DNS クエリを使用して現在地を特定できます。

于 2012-07-18T16:55:07.280 に答える