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

时间:2010-03-25 18:40:26

标签: c# proxy

我正在处理的程序中的互联网连接遇到了很多麻烦,这似乎都是由代理设置的某些问题产生的。此时的大多数问题都已修复,但我现在遇到的问题是我的代理设置测试方法会让一些用户等待很长时间。

以下是我的工作:

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 。这里的问题是如果代理设置不好,则永远不会调用Event,不会抛出异常,程序会在继续之前等待整个超时时间。以下是此方法的代码:

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 个答案:

答案 0 :(得分:2)

您可以在单独的线程中运行proxycheck。如果线程花费的时间过长,请考虑检查失败。

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

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

如果请求未在给定超时内完成,则WebException属性设置为Status的{​​{1}}将被抛出。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

最近的帖子Testing IP:Port proxies使用简单的Python脚本解释了代理检查。该脚本会检查代理服务器的可用性和正确性。