2012-12-19 10 views
12

Ho creato una funzione per un programma, che funziona quando il tipo di richiesta è GET, se è POST, produce sempre un'eccezione di timeout (e il timeout degli anni '50 non è stato raggiunto) sul Linea HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Ho provato molte cose, ma non ho scoperto perché, che qualcuno lo sappia.

Edit: preso a lavorare, se qualcuno è interessato: https://gist.github.com/4347248

Ogni aiuto sarà molto apprezzato.

il mio codice è:request.GetResponse fornisce sempre un timeout

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

funzione "piccolo" ??? –

+0

Ok non è poco ... L'ho rimosso – Tearsdontfalls

+0

Che cosa hai impostato per "timeout"? – VladL

risposta

16

Così fa pendere sul req.GetRequestStream() ogni volta, o funziona "un paio di tentativi" e poi appendere?

Se funziona alcune volte e quindi si blocca, è possibile che non si stiano chiudendo correttamente le richieste, il che causa l'esaurimento delle connessioni. Assicurati di Close() e/o Dispose() gli oggetti HttpWebResponse e tutti gli Stream e i Lettori che stai creando.

+0

Si blocca ogni volta che faccio un 'req.GetRequestStream()'. Grazie, ma non ha funzionato. Ho anche scoperto che quando non si passa alcun parametro di post alla richiesta si connetterà e restituirà un errore di 500 server – Tearsdontfalls

+0

Che cos'è 'data.Length'? Stai cercando di inviare qualcosa di veramente grande? –

+1

Dopo aver riscritto la funzione in base a diversi codici di esempio, ogni richiesta successiva alla terza richiesta non è riuscita. Grazie al tuo suggerimento, ho aggiunto 'Close();' e 'Dispose();' a 'HttpWebRespose' e' Stream's e ora tutto funziona alla grande. Codice: https://gist.github.com/4347248 – Tearsdontfalls

1

È necessario utilizzare response.Dispose();

fine del metodo

Problemi correlati