2010-06-07 66 views
1

有关Web代理的另一个问题。为什么HTTP网页请求和IWebProxy工作在怪异倍

这里是我的代码:

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; 
} 

该代码挂在第一次被调用一两分钟。之后,在连续的调用中,它有时会起作用,但不是其他的。它也不会碰到catch块。

现在怪异的一部分。如果我在GetResponse()调用之前在代码的第一部分添加MessageBox.Show(msg)调用,则这一切都将每次都工作,而不会挂起。这里是一个例子:

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秒后超时,对吧?)或者发生了什么。最令人困惑的是,消息框的调用使得所有的工作都没有挂起。

因此,任何帮助和建议对正在发生的事情表示赞赏。这些都是让我完全无法理解的错误。




编辑和修正:

OK,所以我一直在测试这一点,当我尝试从我收到从响应的URI数据下载问题引起的。我正在使用带WebRequest的GetResponse()方法测试连接,但是正在使用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的都是访问它是一个网络路径到XML文件相同的URL和代理是在这篇文章的顶部的方法创建的同一个。我正在测试以查看创建的IWebProxy是否对指定的路径和文件有效,然后下载文件。

我上面提到的第一段代码和使用WebClient的代码是在不同的类中,并且在不同的时间被调用,但是在代码的第一位使用消息框仍然会使整个事情运行良好,这会混淆我。不知道这里发生了什么,或者Visual Studio中的消息框和运行/调试为何使程序运行正常。建议?

+0

如果没有抛出异常,那么“失败”是什么意思?当你用调试器完成它时会发生什么。 – 2010-06-07 23:31:42

+0

代码失败=异常?死亡蓝屏?什么都没发生? – dtb 2010-06-07 23:33:10

+0

你似乎没有对回应做任何事情。更多的代码会有帮助。 – 2010-06-07 23:38:12

回答

1

所以,我想出解决问题的办法。我们请求的超时时间仍然是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; 
} 

仍不能确定调用究竟是如何的消息框是让一切的工作,但它并没有真正在这一点无关紧要。整个事情就像一个魅力。