Различная производительность между кодом Java и c # при тестировании URL - PullRequest
0 голосов
/ 28 января 2009

При выполнении следующего Java-кода я получаю очень точные и последовательные результаты, определяющие, работает ли тестируемая веб-страница.

protected synchronized boolean checkUrl(HttpURLConnection connection){
    boolean error = false;
    //HttpURLConnection connection = null;
    GregorianCalendar calendar = new GregorianCalendar();

    try{
        if(connection != null){
            connection.connect();

            //200 is the expected HTTP_OK response
            error = processResponseCode(connection.getResponseCode());

            connection.disconnect();
        } else{
            error = false;
        }

    }catch(java.net.UnknownHostException uhe){
        ...     } 
    catch(Exception e){
        ...     }

    return error;
}

Самое близкое совпадение с шаблоном Java в c # имеет гораздо более высокие результаты ложных срабатываний (в основном из-за тайм-аутов - период по умолчанию составляет 100000 мс).

protected bool connectedToUrl = false;
        response = null;

        HttpWebRequest webreq = (HttpWebRequest)WebRequest.Create(this.getUri());
        webreq.Credentials = CredentialCache.DefaultCredentials;
        WebResponse res = null;// webreq.GetResponse();

        try
        {
            WebRequest request = WebRequest.Create(this.getUri()) as WebRequest;
            request.Credentials = CredentialCache.DefaultCredentials;

            if (request != null)
            {
                // Get response 
                res = webreq.GetResponse();

                connectedToUrl = processResponseCode(res);
            }
            else
            {
                logger.Fatal(getFatalMessage());

                string error = string.Empty;
            }
        }
        catch (Exception e)
        {
            throw e;
        }

        return connectedToUrl;
    }

Я пробовал различные шаблоны в c #, чтобы соответствовать эффективности приведенного Java-кода, но безрезультатно.

Есть идеи?

Ответы [ 4 ]

3 голосов
/ 28 января 2009

Я полагаю, это потому, что вы не закрываете ни один из объектов запроса.

1 голос
/ 28 января 2009

Просто измените это:

res = webreq.GetResponse();
connectedToUrl = processResponseCode(res);

до

using (WebResponse res = webreq.GetResponse()) 
{
    connectedToUrl = processResponseCode(res);
}

(Удалить объявление ранее.)

Пока вы не закрыли / не удалили ответ (или он не был завершен), он удерживает соединение. Вы можете иметь только определенное количество (я думаю, по умолчанию 2) подключений к любому хосту одновременно, отсюда и тайм-ауты. Когда вы удаляете ответ, он позволяет другому запросу использовать то же соединение.

1 голос
/ 28 января 2009

Также это:

   catch (Exception e)
   {
      throw e;
   }

Ничего не делает, кроме как уничтожает трассировку стека в исключении, которое всплыло вверх. Если у вас есть обработка ошибок в другом месте вашего кода, я предлагаю удалить блок try catch. В противном случае вы должны зарегистрировать исключение и двигаться дальше. Не просто лови его, чтобы бросить.

0 голосов
/ 28 января 2009

Я думаю, что вам не хватает GregorianCalendar в версии C #: -)

Почему у вас есть два объекта запроса в версии C #?

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