2010-07-09 1 views
6

Я пытался использовать httpwebrequest для использования службы отдыха на удаленном сервере и от самого первого выполнения, мой код зависал программу. Затем я попробовал его как консольное приложение, чтобы убедиться, что он не имеет ничего общего с самой программой, но не повезло!C# httpwebrequest getResponse() зависает и зависает моя программа

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

Пробовал несколько вещей с разных форумов, но это не помогает. Даже простое консольное приложение с вышеуказанным кодом вешает консоль бесконечно! Любая помощь будет большой ..

Благодаря

+0

Попробуйте указать request.ContentLength. Смотрите: http://stackoverflow.com/questions/6736056 –

ответ

10

Вы никогда не закрывая StreamWriter ... так что я подозреваю, что не покраснел. По общему признанию, я ожидал бы ошибку с сервера, а не просто зависание, но стоит посмотреть.

Btw, вам не нужно закрывать ответ и распоряжаться им. Достаточно достаточно только using.

+0

Почему вы отметили это как правильное, а затем в другом месте, которое вы говорите, «попытались закрыть писателя, и он не сделал много»? –

+0

@Lost Hobbit: Я предлагаю вам добавить комментарий к * вопросу * вместо моего ответа - OP не получит уведомление об этом комментарии. (Не то, чтобы OP была в Stack Overflow в течение 11 месяцев в любом случае ...) –

+1

Использовал HtmlAgilityPack и после постоянных переадресаций в этой библиотеке не закрыл базовый ответ перед созданием нового. –

2

Существует не так много, если удаленный сервер не отвечает, кроме определения Timeout, и поймает исключение, как вы это сделали, чтобы сообщить пользователю, что операция не может быть выполнена, потому что удаленный сайт не ответил:

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()) 
{ 

} 

Если вы не хотите, чтобы заморозить UI можно использовать версию асинхронной: BeginGetResponse

0

Попробуйте указать request.ContentLength.

Перед выполнением:

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

Попробуйте что-то вроде этого:

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