GetRequestStream генерирует исключение Timeout случайно - PullRequest
9 голосов
/ 12 февраля 2010

После поиска в течение нескольких дней я действительно не могу решить описанную проблему. Надеюсь здесь найдут решение

Я использую прикрепленный код при вызове службы WCF на том же сервере. Я получаю ошибку тайм-аута случайно при вызове WebReq.GetRequestStream ()

Когда я проверяю netstat, я вижу, что соединение остается открытым, поэтому, возможно, есть проблема, но я не знаю, как ее решить

       //request inicialization
        HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(url);
        WebReq.Method = "POST";
        WebReq.ContentType = "application/json; charset=utf-8";
        WebReq.ContentLength = buffer.Length;

        WebReq.Proxy = null;
        WebReq.KeepAlive = false; //also tried with true
        WebReq.AllowWriteStreamBuffering = false; //also tried with true

        //this produces an error
        using (Stream PostData = WebReq.GetRequestStream())
        {
            PostData.Write(buffer, 0, buffer.Length);
            PostData.Close();
        }

         //open and read response
         HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();
         Stream Answer = WebResp.GetResponseStream();
         StreamReader _Answer = new StreamReader(Answer);

         WebResp.Close();

         //return string
         return _Answer.ReadToEnd();

Тайм-аут генерируется в основном после 10 секунд простоя, но также и после пяти или около того запросов в строке. На самом деле не могу найти шаблон.

Что может быть не так с этим кодом? Есть ли другой (лучший) способ вызова службы WCF?

Ответы [ 4 ]

13 голосов
/ 12 февраля 2010

Я не знаю, что он определенно ответственен за проблему, но вы закрываете веб-ответ, только если он не выдает исключение, и вы никогда не закрываете поток ответа.Используйте операторы using:

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
    return reader.ReadToEnd();
}

. Это вполне может объяснить проблему: если вы оставите ответ открытым, соединение с веб-сервером останется открытым - это означает, что пул соединений не сможет его использовать.подключение.

6 голосов
/ 21 февраля 2011

У меня была такая же проблема, добавление вызова к HttpWebRequest.Abort () , похоже, исправило это.

0 голосов
/ 28 октября 2016

Первое, что нужно иметь в виду, это просмотреть URI, параметры и отправляемые заголовки, а именно:

  • Зарезервированные символы. Отправка зарезервированных символов по URI может принести проблемы ! * ' ( ) ; : @ & = + $ , / ? # []
  • Длина URI: вы не должны превышать 2000 символов
  • Длина заголовков: большинство веб-серверов ограничивают размер принимаемых ими заголовков. Например, в Apache ограничение по умолчанию составляет 8 КБ.

Имейте в виду, что если вы хотите отправить данные с большей длины, рекомендуется отправлять в теле сообщения.

0 голосов
/ 15 февраля 2010

Поскольку это действительно странное поведение, я хотел бы знать, есть ли другие способы вызова службы WCF, размещенной на том же IIS-сервере. Я также считаю, что создание TCP-соединения для вызовов такого типа не очень оптимизировано, а все остальные подходы должны быть намного быстрее.

...