locked
HttpWebRequest. Не могу получить response. RRS feed

  • Вопрос

  • Есть код:

            
    private HttpWebRequest request;
            private HttpWebResponse wResponse;
            private CookieContainer cookieContainer = new CookieContainer();
            #region PRIVATE METHODS
            private void RunRequest(string url)
            {            
    request = HttpWebRequest.Create(new Uri(url)) as HttpWebRequest;
                
    request.UserAgent = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.205 Safari/534.16";
                request.Method = "GET";
               if (request.Method == "POST")
                    request.ContentType = "application/x-www-form-urlencoded";
                request.CookieContainer = cookieContainer;
                if (NetworkInterface.GetIsNetworkAvailable())            {   
                 StartWebRequest(request); 
               }                   
     }        
    private void StartWebRequest(HttpWebRequest request)
            {
                request.BeginGetResponse(new AsyncCallback(FinishWebRequest), request);
            }        
    private void FinishWebRequest(IAsyncResult result)        {      
          wResponse = (result.AsyncState as HttpWebRequest).EndGetResponse(result) as HttpWebResponse;
           }    
        #endregion

    Но wResponse никак не хочется заполняться. Когда как с десктопного приложения все проходит хорошо. Все Capabilities выставлены. Соединение есть. Все гуд. Но оно постоянно ответ null. (жду в цикле пока оно заполнится).

    Что со мной не так?

    Спасибо.  

    20 мая 2012 г. 10:35

Ответы

  • Не видите. Поставьте брекпойнт внутри коллбэка и уберите while {}.

    В WP7 довольно своеобразный планировщик потоков. Скорее всего он не выделяет время на коллбэк в background thread до тех пор, пока видит что ваше приложение занято важной и срочной работой - кручением бесконечного while - в Main UI Thread. UI же не должен тормозить из-за фоновых операций.

    Не пытайтесь сделать работу с сетью синхронной. Обрабатывайте респонс в отдельном потоке, и оттуда через Dispatcher перекидывайте результаты в основной поток. Или дожидайтесь C# 5 с async/await под WP7.

    • Предложено в качестве ответа Viktor Borisov 22 мая 2012 г. 6:26
    • Помечено в качестве ответа Abolmasov Dmitry 23 мая 2012 г. 12:20
    21 мая 2012 г. 20:26

Все ответы

  • Добрый вечер!

    null может возвращать приведение типов при помощи оператора as. Попробуйте заменить  оператор as на стандартное приведение типов. Возможно проблема в этом.

    20 мая 2012 г. 15:45
  • Да ну такое врядли же. Обычное же безопасное приведение)

    Проблема в том, что до FinishWebRequest оно даже не доходит. Не отдает АсинкРезалт

    20 мая 2012 г. 17:33
  • Поставьте брейкпойнты в StartWebRequest и FinishWebRequest. И запустите под отладчиком.
    21 мая 2012 г. 13:10
  • Я этот вопрос-то и задал на основании работы с отладчиком))
    21 мая 2012 г. 14:02
  • Мы ищем иголку в стоге сена. 

    Попробуйте так: создать новое приложение и попытайтесь отправить из него запрос. 

    21 мая 2012 г. 14:07
  • Мы ищем иголку в стоге сена. 

    Попробуйте так: создать новое приложение и попытайтесь отправить из него запрос. 

    Согласен! 

    Сделал для чистоты эксперимента вот так:

     private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
            {
                HttpWebRequest request = HttpWebRequest.Create(new Uri("http://ya.ru")) as HttpWebRequest;  
              HttpWebResponse response = null; 
               request.BeginGetResponse(a =>             { 
                   HttpWebRequest request1 = a.AsyncState as HttpWebRequest;  
                  response = request1.EndGetResponse(a) as HttpWebResponse;  
              }, request); 
               //Че-то делаем, пока не заполнится респонс.
                while (response == null)
                {}       
     }

    Ну не приходит респонс хоть ты тресни! Или я уперся и чего-то не вижу.

    С уважением, Павел. 

    21 мая 2012 г. 19:14
  • Не видите. Поставьте брекпойнт внутри коллбэка и уберите while {}.

    В WP7 довольно своеобразный планировщик потоков. Скорее всего он не выделяет время на коллбэк в background thread до тех пор, пока видит что ваше приложение занято важной и срочной работой - кручением бесконечного while - в Main UI Thread. UI же не должен тормозить из-за фоновых операций.

    Не пытайтесь сделать работу с сетью синхронной. Обрабатывайте респонс в отдельном потоке, и оттуда через Dispatcher перекидывайте результаты в основной поток. Или дожидайтесь C# 5 с async/await под WP7.

    • Предложено в качестве ответа Viktor Borisov 22 мая 2012 г. 6:26
    • Помечено в качестве ответа Abolmasov Dmitry 23 мая 2012 г. 12:20
    21 мая 2012 г. 20:26
  • Блин, действительно, чего это я! 

    Спасибо большое! 

    21 мая 2012 г. 21:09
  • Не забывайте отмечать ответ. Для этого есть кнопка "Пометить как ответ". Спасибо.


    Для связи [mail]

    23 мая 2012 г. 12:20