c# httpwebrequest getResponse() congela e trava o meu programa
-
13-09-2020 - |
Pergunta
Eu estava tentando usar httpwebrequest para usar um resto, como o serviço em um servidor remoto e, a partir da primeira execução em si, a minha código foi deslocado o programa.Então eu tentei como um aplicativo de console para se certificar de que não tem nada a ver com o programa em si, mas sem sorte!
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);
}
Tentei várias coisas a partir de diferentes fóruns, mas ele não ajuda.Até mesmo um simples aplicativo de console com o código acima trava o console indefinidamente!Qualquer ajuda seria ótimo..
Obrigado
Solução
Você nunca está fechando o StreamWriter
...então eu suspeito que não está sendo liberado.Confesso que eu esperava um erro do servidor em vez de apenas uma asa, mas vale a pena olhar.
Btw, você não precisa fechar a resposta e descarte-a.Apenas o using
instrução é o suficiente.
Outras dicas
Não há muito que você pode fazer se o servidor remoto não está a responder os outros do que a definição de um Timeout
e capturar a exceção, como você fez para informar ao usuário que a operação não é concluída porque o site remoto não responder:
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())
{
}
Se você não quiser congelar a INTERFACE do usuário você pode usar a versão assíncrona: BeginGetResponse
Tente especificar o pedido.ContentLength.
Antes de o fazer:
StreamWriter writer = new StreamWriter(request.GetRequestStream());
writer.Write(credentialsJson);
Tente algo como isso:
using (MemoryStream stream = new MemoryStream())
{
using (var writer = StreamWriter writer = new StreamWriter(stream))
{
writer.Write(credentialsJson);
writer.Close();
}
request.ContentLength = stream.Length;
}