2010-07-09 15 views
6

Stavo cercando di utilizzare httpwebrequest per utilizzare un resto come un servizio su un server remoto e dalla prima esecuzione stessa, il mio codice era appeso al programma. Poi l'ho provato come un'applicazione console per assicurarmi che non avesse nulla a che fare con il programma stesso, ma senza fortuna!C# httpwebrequest getResponse() blocca e blocca il mio programma

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

Provato diverse cose da diversi forum ma non aiuta. Anche una semplice app per console con il codice sopra blocca indefinitamente la console! Qualsiasi aiuto sarebbe grande ..

Grazie

+0

provare a specificare request.ContentLength. Vedi: http://stackoverflow.com/questions/6736056 –

risposta

10

Non si è mai chiudere il StreamWriter ... quindi ho il sospetto che non è essere lavata. Ammetto che mi aspetterei un errore dal server invece di un semplice blocco, ma vale la pena guardare.

Btw, non è necessario chiudere la risposta e smaltirla. Solo l'affermazione using è sufficiente.

+0

Perché hai contrassegnato questo come corretto, e poi in un altro posto che dici, "provato a chiudere lo scrittore e non ha fatto molto"? –

+0

@Lost Hobbit: ti suggerisco di aggiungere un commento alla * domanda * anziché alla mia risposta: l'OP non riceverà notifica di questo commento. (Non che l'OP sia stato su Stack Overflow per almeno 11 mesi ...) –

+1

Stava usando HtmlAgilityPack e i seguenti reindirizzamenti permanenti in quella libreria non chiudevano la risposta sottostante prima di crearne una nuova. –

2

Non c'è molto che si può fare se il server remoto non risponde oltre a definire un Timeout e rilevare l'eccezione come hai fatto per informare l'utente che l'operazione non può essere completata perché il sito remoto non ha risposto:

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 non si desidera bloccare l'interfaccia utente è possibile utilizzare la versione asincrona: BeginGetResponse

0

Prova a specificare request.ContentLength.

Prima di fare:

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

provare qualcosa di simile:

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