C# 为什么Http Web请求和IWebProxy在奇怪的时间工作

C# 为什么Http Web请求和IWebProxy在奇怪的时间工作,c#,webrequest,C#,Webrequest,关于Web代理的另一个问题 这是我的密码: IWebProxy Proxya = System.Net.WebRequest.GetSystemWebProxy(); Proxya.Credentials = CredentialCache.DefaultNetworkCredentials; HttpWebRequest rqst = (HttpWebRequest)WebRequest.Create(targetServer); rqst.Proxy = Proxya; rqst.Time

关于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; 
}
此代码在第一次调用时挂起两分钟。之后,在连续的通话中,它有时有效,但在其他通话中无效。它也不会碰到挡块

现在是奇怪的部分。如果我在
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秒后超时,对吗?…)或者发生了什么。最让人困惑的是,消息框调用使所有功能都可以在不挂起的情况下工作

因此,任何关于正在发生的事情的帮助和建议都是非常感谢的。这些就是那种让我完全发疯的虫子




编辑和更正:

好的,我一直在测试这个问题,当我试图从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
}
public void LoadUpdateDataFromNet(字符串url,IWebProxy wProxy)
{
//创建web客户端
System.Net.WebClient webClnt=新系统.Net.WebClient();
//设置代理设置
webClnt.Proxy=wProxy;
webClnt.Credentials=wProxy.Credentials;
字节[]临时字节;
//下载数据并将其放入流中进行读取
尝试
{

tempBytes=webClnt.DownloadData(url);//因此,我找到了问题的答案。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; 
}

仍然不确定调用消息框是如何让一切正常工作的,但这一点并不重要。整个过程就像一个符咒。因此,我找到了问题的答案。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; 
}

仍然不确定呼叫消息框是如何让一切正常工作的,但这一点并不重要。整个过程就像一个符咒。

你说的“失败”是什么意思如果它没有抛出异常?当您使用调试器单步执行时会发生什么情况。代码失败=异常?死亡蓝屏?什么也没有发生?您似乎没有对响应执行任何操作。更多的代码会有所帮助。我没有对响应执行任何操作。我只想使用它来确保代理设置正确无误rect。我们在程序用户的有效代理设置方面遇到了很多问题。我正试图从这个线程实现解决方案:发布新信息。很抱歉发布了这么长的帖子。你说的“失败”是什么意思如果它没有抛出异常?当您使用调试器单步执行时会发生什么情况。代码失败=异常?死亡蓝屏?什么也没有发生?您似乎没有对响应执行任何操作。更多的代码会有所帮助。我没有对响应执行任何操作。我只想使用它来确保代理设置正确无误我们在程序用户的有效代理设置方面遇到了太多问题。我正试图从这个线程实现解决方案:发布新信息。很抱歉发布了这么长的帖子。