0

インターネット接続が利用可能かどうかを確認するために、この関数を作成しました。

    bool IsOnline()
    {
        try
        {
            var request = (HttpWebRequest)WebRequest.CreateHttp("http://www.google.com/");
            request.Timeout = 2000;

            var response = (HttpWebResponse)request.GetResponse();
            return ((int)response.StatusCode) < 400;
        }
        catch (Exception) { return false; }      
    }

ほとんどすべての場合に機能するようですが、私の仕事用ネットワークでは、接続が利用可能なときにタイムアウトエラーが発生するとfalseが返されます。

注:-この関数はfalseを返しますが、WPFアプリケーションのWebブラウザーコンポーネントを使用してオンラインにすることができます-接続はかなり良好です。(したがって、google.comの読み込みに2秒以上費やすことはできません)-コントロールパネル/インターネットオプション/接続で正しく構成されたプロキシの背後にいます

何か案は?

4

2 に答える 2

0

通常の場合、407は、プロキシがあなたをブロックしていることを意味します...タイムアウトは生成されませんが...その「高速」応答であり、例外とは見なされません...

これを試して:

            HttpClientHandler clientHandler = new HttpClientHandler();
            clientHandler.Proxy = new WebProxy("PROXY ip HERE", true, null, System.Net.CredentialCache.DefaultNetworkCredentials);                

            HttpClient cli = new HttpClient(clientHandler);

            cli.BaseAddress = new Uri("http://google.com");

            HttpResponseMessage response = cli.GetAsync("").Result;  // Blocking call!

            textBox1.Text = response.Content.ReadAsStringAsync().Result;

ところで、これはWebAPIを使用しています...

編集:becaerfull!エラー401(自動化されていない)、500(内部サーバーエラー)は400より大きく、接続性の欠如を表すものではありません!!!

于 2012-12-03T16:31:39.630 に答える
0

回避策として、次のように関数を変更しました。

bool IsOnline()
{
    try
    {
        var request = (HttpWebRequest)WebRequest.CreateHttp("http://www.google.com/");
        request.Timeout = 2000;

        var registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", false);
        var proxy = (string)registry.GetValue("ProxyServer");
        var isProxyEnabled = (int)registry.GetValue("ProxyEnable");
        if (isProxyEnabled>0)
        {
            request.Proxy = new WebProxy(proxy, true, null, System.Net.CredentialCache.DefaultNetworkCredentials);
        }

        var response = (HttpWebResponse)request.GetResponse();
        return ((int)response.StatusCode) < 400;
    }
    catch (Exception) { return false; }      
}

WebRequest.GetSystemWebProxy()を使用しようとすると、手動で作成したものと同じ設定のIWebProxy(WrappedWebProxy)が表示されますが、機能しません。「プロキシサーバーでローカルアドレスをバイパスする」をチェックしていない場合も、すべてのアドレスがローカルとして認識されます。

次に、デバッガーを介してバイパスローカルフラグを変更すると、それが機能します。バグのように見えるのはとても奇妙です。

于 2012-12-10T14:57:20.653 に答える