2010-02-12 15 views
9

Birkaç gün boyunca çalışmaya başladıktan sonra, açıklanan sorunu gerçekten çözemiyorum. Umarım burada bir çözüm bulurGetRequestStream, zaman aşımı istisnasını rastgele atar

Aynı sunucuda WCF servisi çağrılırken ekli kod kullanıyorum. Ben çağrı WebReq.GetRequestStream() rastgele zaman aşımı hatası alıyorum

Ben bağlantı açık kalır, bu yüzden muhtemelen bir sorun vardır, ama ben

 //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(); 
çözmek için nasıl bilmiyorum görüyoruz onay netstat olduğum zaman

Zaman aşımı, genellikle 10 saniyelik boşta kalma süresinden sonra, ancak aynı zamanda satırda beş veya daha fazla istekten sonra atılır. Gerçekten bir desen bulamıyor.

Bu kodda neyin yanlış olabilir? WCF servisini aramak için başka (daha iyi) bir yol var mı?

cevap

12

Sorundan kesinlikle sorumlu olduğunu bilmiyorum, ancak yalnızca bir istisna atamadığında web yanıtını kapatıyorsunuz ve yanıt akışını asla kapatmıyorsunuz. using ifadeleri kullanın:

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

Bu problemi iyi açıklayabilir, yanıt bırakın sanki açık web sunucusuna bağlantıyı tutacak açın - bu bağlantıyı kullanamaz sonra bağlantı havuzu anlamına gelir.

+0

Biraz daha iyi, ama hala zaman aşımı oluyor. Yani, gerçekten garip. Bu yüzden, 1. link tıklaması Yükleme ve Yükleme işleminden sonra ve o zaman sayfada aynı veya başka herhangi bir linke tıkladıktan sonra, sayfa ikinci veya daha fazla yüklenir. Yani Bağlantı oluşturma ile ilgili bir sorun var. Sanırım – AnzeR

+0

'un aynı makinede olduğunu fark etmemiştim ... İplik havuzu ipliklerinin bitip bitmediğini merak ediyorum - bunlar aynı süreç içinde mi? –

+0

.net programlamasında oldukça yeniyim. Birkaç yıldır PHP'de programlama yapıyor ve böyle bir problem yaşanmıyor. Bu şeyler çok daha kolay. Yani "iş parçacığı havuzu iş parçacığı" ile ne demek istediniz? Bir isteğimle, bu HTTP isteğini WCF hizmetine iki veya daha fazla yaratıyorum, bu yüzden aynı işlem/istek ile. Bu istekleri için önbellek kullanmalı mıyım? – AnzeR

0

Bu gerçekten garip bir davranış olduğundan, aynı IIS sunucusunda barındırılan WCF hizmetini çağırmanın başka yolları olup olmadığını öğrenmek istiyorum. Ayrıca, gerçekten optimize edilmemiş ve diğer tüm yaklaşımlarda bu tür çağrılar için TCP bağlantısı oluşturmanın çok daha hızlı olması gerekir.

6

Aynı sorunu yaşadım, HttpWebRequest.Abort() numaralı telefona bir arama ekledim.

+0

Teşekkürler! Sorunumu düzeltmeme yardımcı oldu. bağlantıları düzgün;) – pila

0

akılda tutulması gereken ilk şey, özellikle gönderiliyor URI parametrelerini ve başlıkları gözden geçirmektir:

  • Ayrılmış karakterler. sorunları
  • URI Uzunluk ! * ' () ; : @ & = + $ ,/? # [] getirebilir URI tarafından ayrılmış karakterler gönderme: 2000 karakter
  • Uzunluk başlıklarını geçmemelidir: Çoğu web sunucuları kabul ettikleri başlıkların sınırı boyutunu yapmak. Örneğin Apache'de varsayılan limit 8KB'dir.

Verileri daha uzun bir süre göndermek istiyorsanız iletinin gövdesinde göndermeniz önerilir.