3

次のコードがあります

    private bool IsOnline()
    {
        try
        {
            var wr = WebRequest.CreateHttp("http://www.google.com");
            wr.KeepAlive = false;
            wr.Credentials = CredentialCache.DefaultCredentials;
            using (wr.GetResponse())
            {
                return true;
            }
        }
        catch
        {
            return false;
        }
    }

私がそれを実行すると、GetResponse 行に永遠にスタックしたままになります。

回答のおかげで、問題はデフォルト プロキシにあることがわかりました。実際、次の方法で新しいプロキシを作成すると、機能します

        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)
        {
            wr.Proxy = new WebProxy(proxy, true, null, System.Net.CredentialCache.DefaultNetworkCredentials);
        }

問題は、この回避策のコードが手動で設定されたプロキシをレジストリから読み取ることです。ユーザーが「設定を自動的に検出する」を選択した場合は機能しません。

そう: - その場合、どのようにプロキシ アドレスを見つけることができますか? - デフォルトのプロキシが機能しないのはなぜですか?

4

1 に答える 1

0

これは webproxy 自動検出のバグのようです。

ところで、初期コードを使用できる、より洗練された回避策を見つけました。したがって、これこの質問を読んだ後、このコードを App.config ファイルに入れました

<system.net>
  <defaultProxy enabled="true" useDefaultCredentials="true" >
      <proxy autoDetect="True" scriptLocation="http://wpad/wpad.dat"/>
  </defaultProxy>
</system.net>

これにより、プログラムはインターネットオプション設定をスキップして、すぐに wpad をチェックできます (firefox と同様)。

于 2013-05-14T14:05:47.217 に答える