2010-02-11 24 views
10

Me preguntaba si me pueden ayudar con un error que estoy teniendo. Tengo un Administrador de HTTP que he creado que me ayuda a manejar datos de POSTING/GET de sitios web. Ha funcionado bien hasta hace poco cuando trato de usar una mezcla de ambos. El primer bucle redondo funciona, en el segundo ciclo se cuelga en HttpWebRequest.GetRequestStream(). He leído en toda la red y no he encontrado una solución real. A continuación se presentan los bloques de código para el ir a buscar/recepción:¿Alguien sabe por qué recibo un HttpWebRequest Timeout?

ASCIIEncoding encoding = new ASCIIEncoding(); 
byte[] buffer = encoding.GetBytes(_PostData); 

_HttpWebRequest = (HttpWebRequest)WebRequest.Create(_FetchUrl); 
_HttpWebRequest.Credentials = _Credentials; 
_HttpWebRequest.Method = _RequestType.ToString(); 
_HttpWebRequest.ContentType = "application/x-www-form-urlencoded"; 
_HttpWebRequest.ContentLength = buffer.Length; 
_HttpWebRequest.UserAgent = userAgent; 
_HttpWebRequest.CookieContainer = _CookieContainer; 
_HttpWebRequest.KeepAlive = false; 
_HttpWebRequest.AllowAutoRedirect = _AllowAutoRedirect; 
_HttpWebRequest.AutomaticDecompression = DecompressionMethods.GZip; 
_HttpWebRequest.ServicePoint.Expect100Continue = false; 

if (_RequestType.Equals(RequestTypes.POST)) 
{ 
    // Write POST 
Stream reqStream = _HttpWebRequest.GetRequestStream(); 
{ 
    reqStream.Write(buffer, 0, buffer.Length); 
    reqStream.Flush(); 
    reqStream.Close(); 
    } 
} 

Y el Reponse:

HttpWebResponse httpWebResponse = (HttpWebResponse)_HttpWebRequest.GetResponse(); 
{ 
    Stream responseStream = httpWebResponse.GetResponseStream(); 
    { 
    if (_UseGzip) 
    { 
     if (httpWebResponse.ContentEncoding.ToLower().Contains("gzip")) 
     { 
     responseStream = new GZipStream(responseStream, CompressionMode.Decompress); 
     } 
     else 
     { 
     responseStream = new DeflateStream(responseStream, CompressionMode.Decompress); 
     } 
    } 

    if (responseStream != null) 
    { 
     StreamReader streamReader = new StreamReader(responseStream); 
     { 
     try 
     { 
      _PageContent = streamReader.ReadToEnd(); 
     } 
     finally 
     { 
      streamReader.Close(); 
      responseStream.Close(); 
      httpWebResponse.Close(); 
     } 
     } 
    } 
    else 
    { 
     _PageContent = string.Empty; 
    } 
    } 
} 
_HttpWebRequest.Abort(); 

Puede alguien ver los defectos de por qué mi código está colgando? Todas las transmisiones se están cerrando, he establecido las conexiones permitidas a más de 100, no entiendo por qué esto se está rompiendo.

+0

¿Ha intentado utilizar algo así como Wireshark para ver los datos que en realidad se está enviando? – Foole

+0

Cuando dice que el código funciona la primera vez pero se detiene en el segundo, ¿qué métodos http usa durante las solicitudes respectivas? –

+0

El código se cuelga en una publicación, GET parece estar funcionando bien. Cuando ejecuto el código a través de proxy burp funciona bien por alguna razón? Tal vez el proxy está reparando algunos de mis encabezados porque no entiendo cómo debería marcar la diferencia. –

Respuesta

11

Esto puede ser debido al hecho de que usted no está de baja la WebResponse o arroyos o StreamReaders:

var request = WebRequest.Create(...); 
using (var response = request.GetResponse()) 
{ 
    using (var responseStream = response.GetResponseStream()) 
    { 
     using (var reader = new StreamReader(responseStream)) 
     { 
      // use the reader 
     } 
    } 
} 
+0

Estoy cancelando la solicitud (no hay un método de eliminación disponible) y estoy cerrando todas las transmisiones disponibles. También intenté establecer todos los objetos como nulos y luego llamar al GC al final de cada solicitud para eliminarlos, y esto tampoco tuvo ningún efecto. –

+2

@Paul: también necesita deshacerse del 'StreamReader', ya que implementa' IDisposable'. Lo mismo con el 'Stream', que no se cierra si se lanza una excepción. Eso es lo que el bloque 'using' hace por ti. Se asegura de que su parámetro esté Dispuesto, sin importar qué. Tan pronto como escucho que tu código falla en intentos posteriores, me pregunto, "qué es lo que no hizo en el _previo_ intento". Muy a menudo, la respuesta es "algo no se eliminó". –

2

que tenían el mismo problema. Cerré (deseché) todas las secuencias y HttpWebResponse correctamente con estos bloques de uso. El problema aún persistía cuando enviaba spam a las solicitudes que fueron abortadas por ThreadAbortExceptions. Finalmente, ayudó a invocar myWebRequest.Abort() cuando se produjo ThreadAbortException. Espero que esto ayude.

0

veo que utilice:

HttpWebRequest.AutomaticDecompression = DecompressionMethods.GZip; 

Junto con el enfoque manual de descompresión:

 if (httpWebResponse.ContentEncoding.ToLower().Contains("gzip")) 
     { 
     responseStream = new GZipStream(responseStream, CompressionMode.Decompress); 
     } 
     else 
     { 
     responseStream = new DeflateStream(responseStream, CompressionMode.Decompress); 
     } 

No probamos si realmente importa, pero yo uso único enfoque manual y en un código similar, y funciona bien En realidad tengo un problema pendiente, pero solo con un dominio, experimentar con las propiedades mostró diferencia.

Ah, y sospecho que si usted no utiliza ningún tipo de compresión de datos de correos, hay que desmontar contenido de la cabecera de codificación

Cuestiones relacionadas