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

为什么HTTP Web请求和IWebProxy在奇怪的时候工作?

  •  1
  • Mike Webb  · 技术社区  · 14 年前

    关于Web代理的另一个问题。

    这是我的代码:

    IWebProxy Proxya = System.Net.WebRequest.GetSystemWebProxy();
    Proxya.Credentials = CredentialCache.DefaultNetworkCredentials;
    HttpWebRequest rqst = (HttpWebRequest)WebRequest.Create(targetServer);
    
    rqst.Proxy = Proxya;
    rqst.Timeout = 5000;
    try
    {
        rqst.GetResponse();
    }
    catch(WebException wex)
    {
        connectErrMsg = wex.Message;
        proxyworks = false; 
    }
    

    这段代码在第一次调用时会挂起两分钟。在这之后,在连续的通话中,它有时会起作用,但在其他情况下不起作用。它也从来没有碰到过拦网。

    现在是奇怪的部分。如果我添加一个 MessageBox.Show(msg) GetResponse() 每次都可以不挂电话。下面是一个例子:

    try
    {
        // ========Here is where I make the call and get the response========
        System.Windows.Forms.MessageBox.Show("Getting Response");
        // ========This makes the whole thing work every time========
    
    
        rqst.GetResponse();
    }
    catch(WebException wex)
    {
        connectErrMsg = wex.Message;
        proxyworks = false; 
    }
    

    我对它为什么这样做感到困惑。我不知道超时是否不工作(它是以毫秒为单位,而不是以秒为单位,所以应该在5秒后超时,对吗?或者发生了什么。最让人困惑的是,消息框调用使它可以在不挂起的情况下工作。

    因此,对所发生的一切给予帮助和建议,我们将不胜感激。这些是那种让我完全失去理智的虫子。




    编辑和更正:

    好的,所以我一直在测试这个问题,当我尝试从我得到响应的URI下载数据时,问题就产生了。我正在使用getResponse()方法和WebRequest测试连接,但正在使用WebClient下载数据。代码如下:

    public void LoadUpdateDataFromNet(string url, IWebProxy wProxy)
    {
        //Create web client
        System.Net.WebClient webClnt = new System.Net.WebClient();
    
        //set the proxy settings
        webClnt.Proxy = wProxy;
        webClnt.Credentials = wProxy.Credentials;
    
        byte[] tempBytes;
        //download the data and put it into a stream for reading
        try
        {
            tempBytes = webClnt.DownloadData(url); // <--HERE IS WHERE IT HANGS
        }
        catch (WebException wex)
        {
            MessageBox.Show("NEW ERROR: " + wex.Message);
            return;
        }
    
        //Code here that uses the downloaded data
    }
    

    webrequest和webclient都在访问同一个URL,该URL是指向XML文件的Web路径,而代理是在本文顶部的方法中创建的。我正在测试创建的iWebProxy是否对指定的路径和文件有效,然后下载该文件。

    我在上面放的第一段代码和使用WebClient的这段代码是在不同的类中,并且在不同的时间被调用,但是在代码的第一位使用一个消息框仍然使整个过程运行良好,这让我很困惑。不知道这里发生了什么,也不知道为什么消息框和在Visual Studio中运行/调试会使程序正常运行。建议?

    1 回复  |  直到 13 年前
        1
  •  1
  •   Mike Webb    14 年前

    所以,我找到了问题的答案。WE请求的超时仍然是5秒,但是由于某种原因,如果它没有显式关闭,它会使连续的Web请求挂起。下面是代码:

    IWebProxy Proxya = System.Net.WebRequest.GetSystemWebProxy();
    
    //to get default proxy settings
    Proxya.Credentials = CredentialCache.DefaultNetworkCredentials;
    Uri targetserver = new Uri(targetAddress);
    Uri proxyserver = Proxya.GetProxy(targetserver);
    
    HttpWebRequest rqst = (HttpWebRequest)WebRequest.Create(targetserver);
    rqst.Proxy = Proxya;
    rqst.Timeout = 5000;
    
    try
    {
        //Get response to check for valid proxy and then close it
        WebResponse wResp = rqst.GetResponse();
    
        //===================================================================
        wResp.Close(); //HERE WAS THE PROBLEM. ADDING THIS CALL MAKES IT WORK
        //===================================================================
    }
    catch(WebException wex)
    {
        connectErrMsg = wex.Message;
        proxyworks = false; 
    }
    

    尽管还不确定到底是如何调用消息框使一切正常工作,但此时并不真正重要。整件事都很有魅力。