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

¿Fue útil?

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;
}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top