c # - Различия в задержках, возникающих с исключениями HttpWebRequest - PullRequest
0 голосов
/ 17 августа 2011

Я испытываю очень странное поведение с HttpWebRequest, когда он обрабатывает ошибку сервера 500.

В приведенном ниже примере кода вы можете предположить, что http://example.com/service.endpoint немедленно возвращает ошибку 500 на сервере, когда она вызывается.

Когда я запускаю этот код на своем настольном ПК (стандартный компьютер с архитектурой x86 под управлением Windows 7), возникает исключение, я регистрирую его, и метод немедленно завершается. Это мое желаемое поведение.

Когда я запускаю этот код на сервере разработки (гостевая машина vmware на отдельном хосте, Xeon x64 под управлением Windows Server 2008 R2 Standard), исключение немедленно возникает, но для завершения метода требуется около 15 секунд (после исключения будучи поднятым).

Мой вопрос - что может быть причиной различий в поведении, наблюдаемых между двумя тестами?

(Оба метода условия выполнения одинаковы - т.е. я не запускаю код из Visual Studio на своем рабочем столе - оба были запущены в идентичной оболочке службы).

Буду признателен за любую помощь, которую вы можете оказать.

    void MakeRequest(StringBuilder postParams)
    {
        var req = (HttpWebRequest)WebRequest.Create("http://example.com/service.endpoint");

        req.Method = "POST";
        req.ContentType = "application/x-www-form-urlencoded";
        req.KeepAlive = false;

        string postData = postParams.ToString();
        req.ContentLength = postData.Length;

        req.Timeout = 10000;

        Console.WriteLine("Requested started.");

        var stOut = new StreamWriter(req.GetRequestStream(), Encoding.ASCII);
        stOut.Write(postData);
        stOut.Close();

        WebResponse response = null;
        try
        {
            response = req.GetResponse();

            Stream receiveStream = response.GetResponseStream();

            // Deal with response here

            response.Close();
            Console.WriteLine("Request completed.");
        }
        catch (Exception ex)
        {
            if (response != null) response.GetResponseStream().Close();
            req.Abort();
            Console.WriteLine("Exception with request raised: {0}", ex);
        }
        // Delay is observed between above "Exception with request.." and following line:
        Console.WriteLine("MakeRequest() has completed.");
    }

Редактировать: чтобы было понятнее, где существует задержка

Ниже приведена сильно отредактированная версия журналов, которые делает этот вызов. Он служит для того, чтобы показать, где на сервере наблюдается львиная доля задержки (этого не видно на моем рабочем столе):

2011-08-16 16:39:32,475 [STP OrderPool Thread #0] INFO   - Submitting quote to REDACTED
2011-08-16 16:39:32,490 [STP OrderPool Thread #0] INFO   - Invoking ASSEMBLY_NAME_REDACTED, Version=1.0.4245.27855, Culture=neutral, PublicKeyToken=null::REDACTED
2011-08-16 16:39:32,709 [STP OrderPool Thread #0] INFO   - Sending request to: http://example.com/service.endpoint
2011-08-16 16:39:36,334 [STP OrderPool Thread #0] ERROR  - Exception
System.Net.WebException: The remote server returned an error: (500) Internal Server Error.
   at System.Net.HttpWebRequest.GetResponse()
   at HL.Services.Blackbird.LondonBestxHub.Reuters.Execute.MakeRequest(String serviceName, StringBuilder postParams)
2011-08-16 16:39:57,381 [STP OrderPool Thread #0] INFO  - MakeRequest call completed

1 Ответ

0 голосов
/ 17 августа 2011

Здесь есть различные возможности - поиск DNS, прокси и т. Д.

Я бы посоветовал вам установить WireShark на проблемную машину и посмотреть точно что происходитна - это должно показать вам, в чем проблема.

(Кроме того, я настоятельно рекомендую вам использовать using операторы для писателей, потоков, WebResponses и т. д. Я не думаю, что этопроблема здесь, но если что-то случится так, что вам не удастся закрыть WebResponse, вы можете получить тайм-ауты для будущих запросов к тому же хосту из-за пула соединений.)

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