2010-07-09 13 views
6

Estaba tratando de usar httpwebrequest para usar un servicio de descanso en un servidor remoto y desde la primera ejecución en sí, mi código estaba colgando el programa. Luego lo probé como una aplicación de consola para asegurarme de que no tiene nada que ver con el programa en sí, ¡pero sin suerte!C# httpwebrequest getResponse() congela y cuelga mi programa

 string credentialsJson = @"{""username"":""test"", 
             ""password"":""test"" 
            }"; 

     int tmp = ServicePointManager.DefaultConnectionLimit; 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(@"https://qrua.com/qr/service" + @"/auth/login"); 
     request.Method = "POST"; 
     request.KeepAlive = true; 
     request.Timeout = 50000 ; 
     request.CookieContainer = new CookieContainer(); 
     request.ContentType = "application/json"; 
     try 
     { 
      StreamWriter writer = new StreamWriter(request.GetRequestStream()); 
      writer.Write(credentialsJson); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("EXCEPTION:" + e.Message); 
     } 

     //WebResponse response = request.GetResponse(); 
     try 
     { 
      using (WebResponse response = (HttpWebResponse)request.GetResponse()) 
      { 
       Console.WriteLine("request:\n" + request.ToString() + "\nresponse:\n" + response.ContentLength); 
       response.Close(); 
      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("EXCEPTION: in sending http request:" + " \nError message:" + e.Message); 
     } 

Probé varias cosas de diferentes foros, pero no ayuda. ¡Incluso una aplicación de consola simple con el código anterior cuelga la consola indefinidamente! Cualquier ayuda sería grande ..

Gracias

+0

intente especificar request.ContentLength. Ver: http://stackoverflow.com/questions/6736056 –

Respuesta

10

Nunca se está cerrando la StreamWriter ... así que sospecho que no está siendo enrojeció. Es cierto que esperaba un error del servidor en lugar de solo un truco, pero vale la pena mirarlo.

Por cierto, no necesita cerrar la respuesta y eliminarlo. Solo la declaración using es suficiente.

+0

¿Por qué marcó esto como correcto, y luego en otro lugar dice, "intentó cerrar el escritor y no hizo mucho"? –

+0

@Lost Hobbit: sugiero que agregue un comentario a la * pregunta * en lugar de a mi respuesta: el OP no recibirá notificación de este comentario. (No es que el OP haya estado en desbordamiento de pila durante 11 meses de todos modos ...) –

+1

Estaba usando HtmlAgilityPack y los siguientes redireccionamientos permanentes en esa biblioteca no cerraron la respuesta subyacente antes de crear una nueva. –

2

No hay mucho que pueda hacer si el servidor remoto no responde más que definir Timeout y atrapar la excepción como lo hizo para informar al usuario que la operación no puede completarse porque el sitio remoto no respondió:

var request = (HttpWebRequest)WebRequest.Create("https://qrua.com/qr/service/auth/login"); 
request.Timeout = 5000; 
// If the server doesn't respond within 5 seconds you might catch the timeout exception 
using (var response = request.GetResponse()) 
{ 

} 

Si no desea congelar la interfaz de usuario se puede utilizar la versión asíncrona: BeginGetResponse

0

intente especificar request.ContentLength.

Antes de hacer:

 StreamWriter writer = new StreamWriter(request.GetRequestStream()); 
     writer.Write(credentialsJson); 

intentar algo como esto:

using (MemoryStream stream = new MemoryStream()) 
{ 
    using (var writer = StreamWriter writer = new StreamWriter(stream)) 
    { 
     writer.Write(credentialsJson); 
     writer.Close(); 
    } 
    request.ContentLength = stream.Length; 
} 
Cuestiones relacionadas