Я испытываю очень странное поведение с 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