2010-02-12 14 views
9

Po kilkugodzinnym wyszukiwaniu w Google nie mogę rozwiązać opisanego problemu. Mam nadzieję, że tutaj znajdzie rozwiązanieGetRequestStream losowo generuje wyjątek Timeout

Używam załączonego kodu podczas wywoływania usługi WCF na tym samym serwerze. Otrzymuję błąd Timeout losowo WebReq.GetRequestStream call()

Kiedy jestem wyboru netstat widzę, że połączenie pozostaje otwarte, więc prawdopodobnie jest jakiś problem, ale nie wiem jak go rozwiązać

 //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(); 

Limit czasu jest generowany głównie po około 10 sekundach bezczynności, ale także po pięciu lub więcej żądaniach z rzędu. Naprawdę nie mogę znaleźć wzorca.

Co może być nie tak z tym kodem? Czy istnieje inny (lepszy) sposób wywoływania usługi WCF?

Odpowiedz

12

Nie wiem, czy to zdecydowanie odpowiada za problem, ale zamykasz reakcję sieci tylko wtedy, gdy nie rzuca wyjątku i nigdy nie zamykasz strumienia odpowiedzi. Użyj using oświadczenia:

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

Może to dobrze wyjaśnić problem, ponieważ jeśli zostawić odpowiedź otwórz go będzie utrzymywać połączenie z serwerem WWW Open - czyli zestawianie połączeń wówczas nie można korzystać z tego połączenia.

+0

Jest trochę lepiej, ale wciąż dostaję limity czasu. To naprawdę dziwne. Po pierwszym kliknięciu linku kliknij opcję Ładowanie i ładowanie, a jeśli w tym czasie klikniesz na to samo lub dowolne inne łącze na stronie, strona wczyta się w ciągu sekundy. Coś jest nie tak z tworzeniem połączenia. Jak sądzę, – AnzeR

+0

nie zauważyłem, że jest na tej samej maszynie ... Zastanawiam się, czy kończy ci się wątek puli wątków - czy są one w tym samym procesie? –

+0

Jestem całkiem nowy w programowaniu .net. Już od kilku lat programuję w PHP i nigdy nie zauważam takich problemów. Są takie rzeczy o wiele łatwiejsze. Więc nie jestem pewien, co miałeś na myśli, mówiąc "z wątków puli wątków"? Za pomocą jednego żądania tworzę dwa lub więcej tego żądania HTTP do usługi WCF, więc jest to przy tym samym procesie/żądaniu. Czy należy używać buforowania dla tych żądań? – AnzeR

0

Ponieważ jest to naprawdę dziwne zachowanie chciałbym wiedzieć, czy istnieją inne sposoby wywoływania usługi WCF, hostowane na tym samym serwerze IIS. Też, że tworzenie połączenia TCP dla tego rodzaju połączeń nie jest zoptymalizowane, a wszystkie inne podejścia powinny być znacznie szybsze.

6

Miałem ten sam problem, dodając, że wywołanie HttpWebRequest.Abort() wydawało się to naprawić.

+0

Dziękuję! Pomogła mi rozwiązać problem. Pamiętaj: Zawsze zamykaj połączenia poprawnie;) – pila

0

Pierwszą rzeczą, aby pamiętać, aby przejrzeć uri, parametry i nagłówki są wysyłane, a konkretnie:

  • znaki zastrzeżone. Wyślij znaki zastrzeżone przez URI może przynieść problemy ! * ' () ; : @ & = + $ ,/? # []
  • URI Długość: Nie należy przekraczać 2000 znaków
  • nagłówki Długość: Większość serwerów zrobić wielkość graniczną nagłówków oni akceptują. Na przykład w Apache domyślny limit to 8 KB.

Należy pamiętać, że jeśli chcesz wysłać dane z większej długości, zalecamy przesłanie treści wiadomości.

Powiązane problemy