c# httpwebrequest getResponse() congela y cuelga mi programa
-
13-09-2020 - |
Pregunta
Estaba intentando usar httpwebrequest para usar un servicio tipo descanso en un servidor remoto y desde la primera ejecución, mi código colgaba el programa.Luego lo probé como una aplicación de consola para asegurarme de que no tuviera nada que ver con el programa en sí, ¡pero no tuve suerte!
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 en diferentes foros pero no ayudó.¡Incluso una aplicación de consola simple con el código anterior bloquea la consola indefinidamente!Cualquier ayuda sería genial..
Gracias
Solución
Nunca cerrarás el StreamWriter
...entonces sospecho que no se está descargando.Es cierto que esperaría un error del servidor en lugar de simplemente un bloqueo, pero vale la pena verlo.
Por cierto, no es necesario cerrar la respuesta. y desecharlo.Solo el using
declaración es suficiente.
Otros consejos
No hay mucho que pueda hacer si el servidor remoto no está respondiendo, aparte de definir un Timeout
y cogida la excepción como lo hizo para informar al usuario que la operación no puede completarse porque el sitio remoto no responde:
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, podría usar la versión de ASYNC: bEEGETRESPONSE
Intente especificar la solicitud.contentlength.
antes de hacer:
StreamWriter writer = new StreamWriter(request.GetRequestStream());
writer.Write(credentialsJson);
prueba 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;
}