2012-12-19 43 views
12

verir Bir program için bir işlev yaptım, istek türü , olduğunda çalışır, her zaman bir zaman aşımı özel durumu (ve 50s zaman aşımı ulaşılmadı) üretir. Line HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Birçok şeyi denedim, ama nedenini anlamadım, burada birileri biliyor olabilir.

Düzenleme: Birisi ilgileniyor eğer çalışmak var,: https://gist.github.com/4347248

Herhangi bir yardım büyük takdir edilecektir.

Benim Kod geçerli:request.GetResponse her zaman için bir zaman aşımı süresi

public ResRequest request(string URL, RequestType typ, CookieCollection cookies, string postdata ="", int timeout= 50000) 
    { 
     byte[] data; 
     Stream req; 
     Stream resp; 

     HttpWebRequest request = WebRequest.Create(URL) as HttpWebRequest; 
     request.Timeout = timeout; 
     request.ContinueTimeout = timeout; 
     request.ReadWriteTimeout = timeout; 
     request.Proxy = new WebProxy("127.0.0.1", 8118); 
     request.Headers.Add(HttpRequestHeader.AcceptLanguage, "de"); 
     request.Headers.Add("UA-CPU", "x86"); 


     request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate"); 
     request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.21022; .NET CLR 3.5.30729; .NET CLR 3.0.30618) "; 
     request.CookieContainer = new CookieContainer(); 
     request.CookieContainer.Add(cookies); 
     if (typ == RequestType.POST) 
     { 
      data = System.Text.Encoding.Default.GetBytes(postdata); 
      request.Method = "POST"; 
      request.ContentType = "application/x-www-form-urlencoded"; 
      request.ContentLength = data.Length; 
      req = request.GetRequestStream();//after a few tries this produced a Timeout error 
      req.Write(data, 0, data.Length); 
      req.Close(); 
      HttpWebResponse response = (HttpWebResponse)request.GetResponse();//This line produces a Timeout Exception 
      resp = response.GetResponseStream(); 

      if ((response.ContentEncoding.ToLower().Contains("gzip"))) 
      { 
       resp = new System.IO.Compression.GZipStream(resp, System.IO.Compression.CompressionMode.Decompress); 
      } else if ((response.ContentEncoding.ToLower().Contains("deflate"))) { 
       resp = new System.IO.Compression.DeflateStream(resp, System.IO.Compression.CompressionMode.Decompress); 
      } 

      return new ResRequest() { result = new System.IO.StreamReader(resp, System.Text.Encoding.UTF8).ReadToEnd(), cookies = response.Cookies, cstring = cookiestring(response.Cookies) }; 

     } 
     else 
     { 
      request.Method = "GET"; 

      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      resp = response.GetResponseStream(); 

      if ((response.ContentEncoding.ToLower().Contains("gzip"))) 
      { 
       resp = new System.IO.Compression.GZipStream(resp, System.IO.Compression.CompressionMode.Decompress); 
      } 
      else if ((response.ContentEncoding.ToLower().Contains("deflate"))) 
      { 
       resp = new System.IO.Compression.DeflateStream(resp, System.IO.Compression.CompressionMode.Decompress); 
      } 

      return new ResRequest() { result = new System.IO.StreamReader(resp, System.Text.Encoding.UTF8).ReadToEnd(), cookies = response.Cookies, cstring = cookiestring(response.Cookies) }; 
     } 

    } 
+0

"LITTLE" işlevi ??? –

+0

Tamam değil küçük ... Kaldırdım – Tearsdontfalls

+0

´timeout´ için neyi ayarlıyorsunuz? – VladL

cevap

16

Yani req.GetRequestStream() her zaman askıda ya da "bir kaç denemeden" çalışır ve daha sonra askıda?

Birkaç kez çalışır ve sonra askıda kalırsa, istekleri düzgün bir şekilde kapatmamanız olasıdır; bu da bağlantıların bitmesine neden olur. HttpWebResponse nesnelerini ve oluşturduğunuz Akışların ve Okuyucuların tümünü Close() ve/veya Dispose() olduğundan emin olun.

+0

Her seferinde bir "req.GetRequestStream()') kilitler. Teşekkürler, ama işe yaramadı. Ayrıca, herhangi bir Post Parametresi isteğine geçmediğimde, 500 Sunucu Hatası'na bağlanacağını ve döndüreceğimi de öğrendim. – Tearsdontfalls

+0

'data.Length' nedir? Gerçekten büyük bir şey göndermeye mi çalışıyorsun? –

+1

Birkaç örnek kod temelinde işlevini yeniden yazdıktan sonra, üçüncü istek sonrası her istek başarısız oldu. Bahşişiniz sayesinde 'Close();' ve 'Dispose();' 'HttpWebRespose' ve' Stream'lere ekledim ve şimdi her şey harika çalışıyor. Kod: https://gist.github.com/4347248 – Tearsdontfalls

1

yanıtını kullanmalısınız.Dispose();

yönteminin sonu