代码之家  ›  专栏  ›  技术社区  ›  Mike Webb

测试代理设置的首选或接受方法是什么?

  •  6
  • Mike Webb  · 技术社区  · 16 年前

    我正在开发的程序中的Internet连接有很多问题,这一切似乎都是由代理设置的某些问题引起的。此时的大多数问题都已解决,但我现在面临的问题是,我测试代理设置的方法会让一些用户等待很长时间。

    我要做的是:

    System.Net.WebClient webClnt = new System.Net.WebClient();
    
    webClnt.Proxy = proxy;
    webClnt.Credentials = proxy.Credentials;
    
    byte[] tempBytes;
    try
    {
        tempBytes = webClnt.DownloadData(url.Address);
    }
    catch
    {
        //Invalid proxy settings
    
        //Code to handle the exception goes here
    }
    

    这是我找到的测试代理设置是否正确的唯一方法。我尝试对我们的Web服务进行Web服务调用,但在进行调用时不需要代理设置。即使我有伪造的代理设置,它也能工作。不过,上面的方法没有我可以设置的超时成员,我可以找到并使用DownloadData,而不是DownloadDataAsync,因为我需要等到方法完成后才能知道设置是否正确,然后才能在程序中继续。

    对于这种方法的更好的方法或解决方法的任何建议,我们将不胜感激。

    迈克

    编辑:我还试过别的,但没有运气。我使用DownloadDataAsync方法在单独的线程中下载数据,该线程在完成时引发WebClient的DownloadDataCompleted事件。当我等待事件被调用时,我有一个循环:while(datetime.now<downloadstart.addminutes(timeout)&!testisdone)当调用事件时,DownloadDataCompleted事件将testisdone成员设置为true。这里的问题是,如果代理设置不好,则永远不会调用事件,不会引发异常,并且程序在继续之前等待整个超时时间。以下是此方法的代码:

    public static bool TestProxy(System.Net.WebProxy proxy)
    {
        ProxySettingsTestDone = false; //public static var
        string address = //url to some arbitrary data on our server
    
        System.Net.WebClient webClnt = new System.Net.WebClient();
    
        webClnt.Proxy = proxy;
        webClnt.Credentials = proxy.Credentials;
    
        try
        {
            webClnt.DownloadDataCompleted += new System.Net.DownloadDataCompletedEventHandler(DownloadDataCallback);
            webClnt.DownloadDataAsync(new Uri(address));
    
            //Timeout period
            DateTime dnldStartTime = DateTime.Now;
            while (DateTime.Now < dnldStartTime.AddMinutes(1.0) && !ProxySettingsTestDone)
            { }
    
            if (!ProxySettingsTestDone) //Exceded timeout
            {
                throw new System.Net.WebException("Invalid Proxy Settings");
            }
        }
        catch (System.Net.WebException e)
        {
            if (e.Status == System.Net.WebExceptionStatus.ProxyNameResolutionFailure)
            {
                //Proxy failed, server may or may not be there
                Util.ConnectivityErrorMsg = e.Message;
                return false;
            }
            else if (e.Status == System.Net.WebExceptionStatus.ProtocolError)
            {
                //File not found, server is down, but proxy settings succeded
                ServerUp = false;
                Util.ConnectivityErrorMsg = e.Message;
                return true;
            }
    
            return false;
        }
    
        Util.ConnectivityErrorMsg = "";
        return true;
    }
    
    private static void DownloadDataCallback(object sender, System.Net.DownloadDataCompletedEventArgs e)
    {
        if (!e.Cancelled && e.Error == null)
            ProxySettingsTestDone = true;
        else
            throw new System.Net.WebException("Invalid Proxy Settings");
    }
    

    对不起,这封长信。我想用测试这个新方法后发现的信息来更新这个问题。

    谢谢, 迈克

    3 回复  |  直到 12 年前
        1
  •  2
  •   ReinierDG    16 年前

    您可以在单独的线程中运行proxycheck。如果线程花费的时间太长,则认为检查失败。

    或者您可以使用WebRequest,它允许您设置超时:

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://url");
    request.Proxy = proxy;
    request.Timeout = 2000;
    

    如果请求没有在给定的超时时间内完成, WebException Status 属性设置为 WebExceptionStatus.Timeout 将被抛出。

        2
  •  1
  •   Manuel Lucas    16 年前

    这里提到的每种方法都是有效的。但最重要的一点是,对于您要测试的进程,使用相同的Windows用户帐户测试代理连接。许多代理对每个Windows用户都有特定的权限。

        3
  •  0
  •   Guest    12 年前

    最近的一篇文章 Testing IP:Port proxies 说明使用简单的python脚本进行代理检查。该脚本检查代理服务器的可用性和正确性。