2016-03-17 5 views
0

Я разрабатываю мобильное приложение с использованием Xamarin. Приложение использует API, который недавно выпустил новую версию, используя HTTPS вместо HTTP. При изменении URL-адреса для использования HTTPS и добавления заголовка atuhorization запрос застревает и в конечном итоге истечет время ожидания. API-вызовы отлично работают при тестировании в Postman, например.WebClient get/post to https always timeout

Все вызовы API сделаны из портативной библиотеки, и я запускаю приложение на физическом устройстве.

У кого-нибудь есть идеи о том, что я могу сделать, чтобы решить эту проблему?

Это код, который я использую для отправки данных в API:

private async Task<HttpResponseMessage> PostData(HttpContent content, string authKey) 
    { 
     using (var client = new HttpClient()) 
     { 
       client.DefaultRequestHeaders.Add("Authorization", authKey); 
       client.Timeout = new TimeSpan(0, 0, 25); 

       var response = await client.PostAsync(BaseUrl, content); 
       return response; 
     } 
    } 

EDIT

Я пробовал много различных решений, настройка заголовков типа содержимого и так далее, но ничего не получалось , Я пытался использовать HttpWebRequest вместо HttpClient, но без успеха.

Я создал консольное приложение на C# и создал новый чистый проект Xamarin для Android. Все работает в консольном приложении, но не в проекте Xamarin.

+0

Если вы тестируете на Android, подключите устройство к инструменту монитора Android SDK и посмотрите на логарифм, это может немного осветить проблему. – Gusman

+0

Я знаю, что это звучит глупо, но у меня была такая ситуация: мы включили номер порта (нестандартный http: 80) в настройке baseurl клиента и забыли удалить его, когда мы переключили наш сервер на прослушивание по умолчанию 80/443 порты – derpirscher

ответ

0

Я получил его для работы в чистом проекте Xamarin Android, но только при использовании ModernHttpClient.

Но при реализации его в моей портативной библиотеке классов он все равно не работает. Вместо этого перемещение моих веб-запросов на конкретный проект платформы заставило его работать! Я закончил использование интерфейса, объявляющего метод post. Каждый проект платформы объявляет «PostHandler», который использует PCL.

public interface IPostHandler 
{ 
    Task<HttpResponseMessage> BeginPost(HttpContent content, string requestUri); 
} 

public class AndroidPostHandler : IPostHandler 
{ 
    public async Task<HttpResponseMessage> BeginPost(HttpContent content, string requestUri) 
    { 
     using (var client = new HttpClient(new NativeMessageHandler())) 
     { 
      var response = await client.PostAsync(baseUrl, content); 
      return response; 
     } 
    } 
}