Windows フォーム アプリケーションがあります。ユーザーが自分のアプリケーションのライセンスをインポートするときに、「電話をかけ」(Web 上の aspx ページにアクセス)、ライセンス情報を登録したいと考えています。
問題は、ユーザーがその時点でインターネットに接続していない可能性があることです。これをまずテストしたいと思います。ユーザーがインターネット接続を利用できるかどうかを検出する最良の方法は何ですか?
Windows フォーム アプリケーションがあります。ユーザーが自分のアプリケーションのライセンスをインポートするときに、「電話をかけ」(Web 上の aspx ページにアクセス)、ライセンス情報を登録したいと考えています。
問題は、ユーザーがその時点でインターネットに接続していない可能性があることです。これをまずテストしたいと思います。ユーザーがインターネット接続を利用できるかどうかを検出する最良の方法は何ですか?
PPOE では、この質問に少なくとも 10 万ドルが費やされました。主な問題点:
多くの場合、HTTP 接続は切断され、「200 OK」メッセージが返されます。それはあなたのサイトではありません。それはホテル/カフェ/あなたを接続するために提供するあらゆるルーターです.
API は、興味深く創造的な方法で配置されます。たとえば、一部の Windows ネットワーク API は、モデムを使用していて、その後 DSL にアップグレードしたがウィザードを実行しなかった場合、不正な接続データを返します。
一部の (非常に重要な) 場所では、接続を試みると、ダイヤルアップで接続が開始され、分単位の料金が発生します。繰り返しますが、PPOE では、午前 3 時にこれを実行するかなり人気のあるソフトウェアが出荷されました。ひどく不機嫌な顧客のために作られました。
一部の主要な ISP は、ブロードバンドで実行するときに「独自の」ソフトウェアを使用しており、与えられた優れたイーサネットと TCP/IP を使用するだけの賢さはありません。代わりに、イーサネットを使用してモデムをエミュレートします (これは、イーサネット +tcp/ip セットアップをエミュレートするように設定されています)。これは PPPOE と呼ばれ、使用しようとしているアダプターを判別するのが難しくなります。
コンピュータがローカル ボックスにのみ「接続」されている DSL および Cabel モデムを使用する家庭がますます増えています。ローカルボックスが接続を失った可能性があり、あなたにはわかりません.
唯一の解決策は、接続を試みて戻り値を検証することです。
WebRequest.GetResponseメソッドを確認する
// Create a new WebRequest Object to the mentioned URL.
WebRequest myWebRequest=WebRequest.Create("http://www.contoso.com");
Console.WriteLine("\nThe Timeout time of the request before setting is : {0} milliseconds",myWebRequest.Timeout);
// Set the 'Timeout' property in Milliseconds.
myWebRequest.Timeout=10000;
// This request will throw a WebException if it reaches the timeout limit before it is able to fetch the resource.
WebResponse myWebResponse=myWebRequest.GetResponse();
または InternetGetConnectedState API を呼び出すことができます
[DllImport("wininet.dll")]
private extern static bool InternetGetConnectedState(out int Description, int ReservedValue ) ;
public static bool IsConnectedToInternet()
{
int Desc ;
return InternetGetConnectedState(out Desc, 0);
}
リクエストを実行する前に接続が利用可能かどうかをテストする利点はありません。チェックした後も接続がダウンする可能性があり、試してみる前にリクエストが機能するかどうかを確認する信頼できる方法はありません. また、ユーザーにとってのメリットもありません。
私が見る唯一の正当なテストは、利用可能なネットワーク インターフェイスがあるかどうかです。これは、ユーザーがまだダイヤルアップ接続している場合に、ダイヤルアップ プロンプトでユーザーを悩ませないようにするためです。
「ホーム」ホストに ping を送信して、応答が返されるかどうかを確認できます。
「インターネット接続」を定義します。私には「インターネット接続」はありません。tcp/ip 接続、dns サーバー、Web サーバーなどがあります。Web ページを読み込んで、動作するかどうかを確認するのが最善の方法です。示唆されているように、自分自身に ping を試すこともできますが、それは Web サーバーが実行されていることや、ページをロードできることを意味するものではありません。それは、実際にページを読み込んで初めて確認できます。
私が使用した方法の 1 つは、常に「true」を返すブール メソッドを使用して Web サービスを作成することです。アプリから呼び出して、例外または "false" が発生した場合は、接続されていません。
[WebMethod]
public bool IsAvailable()
{
return true;
}
そしてそれを呼び出します:
private bool IsOnline()
{
Cursor = Cursors.WaitCursor;
var proxy = new WS();
bool IsOnline = false;
try
{
IsOnline = proxy.IsAvailable();
}
catch (System.Net.WebException WebEx)
{
NameValueCollection nvc = new NameValueCollection();
nvc.Add("WebException Status", WebEx.Status.ToString());
if (WebEx.Status == System.Net.WebExceptionStatus.ProtocolError)
{
nvc.Add("Status Code", ((System.Net.HttpWebResponse)WebEx.Response).StatusCode.ToString());
nvc.Add("Status Description", ((System.Net.HttpWebResponse)WebEx.Response).StatusDescription);
}
ExceptionManager.Publish(WebEx, nvc);
}
catch (Exception)
{
IsOnline = false;
}
Cursor = Cursors.Default;
return IsOnline;
}
アプリで常にインターネット接続を確認する必要があるときは、google.com に ping を送信するだけでした。