Почему Http Web Request и IWebProxy работают в странные времена - PullRequest
1 голос
/ 08 июня 2010

Еще один вопрос о веб-прокси.

Вот мой код:

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.

Теперь странная часть.Если я добавлю вызов 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-адресу, который является веб-путем к XML-файлу, а прокси-сервер является тем же, который создан в методе в верхней частиэта почта.Я тестирую, чтобы убедиться, что созданный IWebProxy действителен для указанного пути и файла, а затем загружает файл.

Первый фрагмент кода, который я поместил выше, и этот код с использованием WebClient находятся в отдельных классах и называютсяв разное время, тем не менее, использование окна сообщения в первом бите кода заставляет все работать нормально, что меня смущает.Не уверен, что все здесь происходит или почему окна сообщений и запуск / отладка в Visual Studio заставляют программу работать нормально.Предложения?

1 Ответ

1 голос
/ 20 июля 2010

Итак, я разобрался с ответом на проблему. Тайм-аут для запроса we по-прежнему составляет 5 секунд, но по какой-то причине, если он явно не закрыт, это приводит к зависанию последовательных веб-запросов. Вот код сейчас:

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

Все еще не уверен, как именно вызов окна сообщения заставлял все работать, но это не имеет большого значения в данный момент. Все это работает как шарм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...