System.Net.WebRequest - Повторное использование / кэш TCP-соединения - PullRequest
1 голос
/ 19 октября 2010

Этот вопрос меня озадачил. Это происходило три раза за последние 12 месяцев на нашем производственном сервере и вызывает серьезные проблемы, когда это происходит. Любая помощь будет оценена.

У нас есть служба Windows .NET, которая отправляет HTTP-запросы на сторонний сервер. «Что-то» происходит, и следующие 2-3 запроса завершаются ошибкой с ошибкой 503 сервера, последующие запросы получают исключения тайм-аута. Звучит как проблема с сервером, верно? Однако если я наберу URL-адрес запроса в браузере, он вернет ответ.

Проблема решена путем перезапуска службы .NET, что теперь заставляет меня думать, что это проблема клиента, но я не могу придумать, как это сделать. Используется ли основное TCP-соединение с сервером повторно или кэшируется? Можно ли заставить .NET заново создать соединение?

Ниже приведен код веб-запроса.

public string GetResponseFromServer( string requestXML, string serverUrl, int Timeout )
{
    System.Net.WebRequest req = System.Net.WebRequest.Create( serverUrl );
    req.Method = "POST";
    req.Timeout = Timeout;

    byte[] requestBodyBytes = System.Text.Encoding.UTF8.GetBytes( requestXML );

    req.ContentLength = requestBodyBytes.Length;

    Stream newStream = req.GetRequestStream();
    newStream.Write( requestBodyBytes, 0, requestBodyBytes.Length );
    newStream.Close();

    System.Net.WebResponse response = req.GetResponse();

    StreamReader reader = new StreamReader( response.GetResponseStream() );
    return reader.ReadToEnd();
}

1 Ответ

1 голос
/ 19 октября 2010

Ошибки могут быть связаны с утечкой ресурсов. Ни response, reader, ни поток, возвращенный response.GetResponseStream(), не удаляются. Оберните эти ресурсы в операторы using, чтобы убедиться, что все они утилизируются правильно:

using (Stream newStream = req.GetRequestStream())
{
  newStream.Write( requestBodyBytes, 0, requestBodyBytes.Length );
}

using (System.Net.WebResponse response = req.GetResponse())
{
  using (Stream responseStream = response.GetResponseStream())
  {
    using (StreamReader reader = new StreamReader( responseStream ))
    {
      return reader.ReadToEnd();
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...