2016-06-16 2 views
2

я с помощью HttpClient отправить запрос поста на локальном сервере (питание на лампе или MAMP, попробовал оба), но не могу получить ответ, всегда получает «Задание отменено исключение» с помощью следующего кодаXamarin HttpClient работает странно

 try 
     { 
      using (HttpClient client = new HttpClient()) 
      { 
       client.Timeout = new TimeSpan(0, 0, 10); 
       var sendContent = new StringContent(serialized); 

       using (HttpResponseMessage response = await client.PostAsync(url.ToString(), sendContent)) 
       { 
        if (response.StatusCode != HttpStatusCode.OK) 
         return MakeError("Bad status: " + response.StatusCode.ToString()); 

        using (HttpContent content = response.Content) 
        { 
         string str = await content.ReadAsStringAsync(); 
         if (str == null) 
          return MakeError("Got null answer"); 

         App.Log("Response: " + str); 
         return str; 
        } 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      App.Log("There is something bad with request: " + serialized + " the error was " + e.Message + " url = " + url.ToString()); 


      return MakeError("Timed out"); 
     } 

Правильный URL-адрес, если я пытаюсь выполнить этот код на C# Console Application, я могу получить ответ (но не с Xamarin, Android и iOS, на устройстве и эмуляторах).

Я также пытался обнюхать пакеты HTTP, и я увидел, что ответ был отправлен моим локальным сервером, но Xamarin не справился с этим правильным способом. НО, если заменить url с доменом (например, http://stackoverflow.com), я могу получить ответ.

После HTTP ответ заголовки:

  1. Подключение → закрытия (поддержания активности не работает тоже)
  2. Content-Length → 951
  3. Content-Type → приложение/JSon
  4. Дата → чт, 16 июня 2016 18:11:40 GMT
  5. Сервер → Apache
  6. X-Powered-By → PHP/5.5.14

Любые предложения?

+1

какой конкретный адрес вы используете? Имейте в виду, что если вы используете это эмулятор/симулятор Android/iOS, у него есть отдельный IP-адрес с вашего локального ПК и он не может использовать localhost для общения с сервером. Он также не сможет разрешить локальный URL-адрес. – Jason

ответ

2

Один из возможных вопросов - ваш 8-секундный тайм-аут.

От HttpClient documentation:

Значение по умолчанию равно 100000 миллисекунд (100 секунд).

Запрос на доменную систему (DNS) может занять до 15 секунд, чтобы вернуть или тайм-аут. Если ваш запрос содержит имя хоста, для которого требуется разрешение , и вы установите Timeout на значение менее 15 секунд, оно может занять 15 секунд или более до того, как будет выведено WebException, чтобы указать время ожидания по вашему запросу.

Таким образом, для запроса DNS требуется 15 секунд, если это происходит в вашем вызове. Удалите тайм-аут и посмотрите, все еще проблема.

+0

Вау, интересно, но это работает! Странно, что в моем url не было домена, но IP и DNS по-прежнему нужны. Большое спасибо. –

+0

@AlexBakanov Нет проблем. Возможно, DNS не используется, но запрос потребовал больше 8 секунд. Рад, что смог помочь. – hvaughan3

Смежные вопросы