2016-07-10 5 views
1

У меня есть ASP.NET WebApi, размещенный в Azure. На нем нет аутентификации HTTP Header или Azure API, а сеансы скрипача доказывают, что API полностью функциональен и выплескивает данные по запросу и ожидаемым.Xamarin Forms HttpClient GetAsync

В моих формах Xamarin (PCL, IOS & Android только) PCL проект, я следующий код в классе обслуживания:

public async Task<IEnumerable<Link>> GetCategories() 
    { 
     IEnumerable<Link> categoryLinks = null; 
     using (var client = new HttpClient()) 
     { 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

      //Using https to satisfy iOS ATS requirements 
      var response = await client.GetAsync(new Uri("https://myproject.azurewebsites.net/api/contents")); 

      //response.EnsureSuccessStatusCode(); //I was playing around with this to see if it makes any difference 
      if (response.IsSuccessStatusCode) 
      { 
       var content = response.Content.ReadAsStringAsync().Result; 
       categoryLinks = JsonConvert.DeserializeObject<IEnumerable<Link>>(content); 
      } 
     } 
     return categoryLinks; 
    } 

Я отлажен код и заметил, что контроль не проходит мимо :

var response = await client.GetAsync(new Uri("https://myproject.azurewebsites.net/api/contents")); 

и в результате категорияLinks остается без изменений.

Неужели кто-нибудь сталкивался с этим раньше?

Несколько вещей, чтобы отметить:

  • Хотя я сомневаюсь, что если есть проблема здесь, но у меня есть класс MainViewModel, который выглядит следующим образом:

    public class MainViewModel 
    { 
        private readonly INavigation navigation; 
        private readonly IContentService contentService; 
    
        public IEnumerable<CategoryItem> Categories { get; set; } 
    
        public MainViewModel(IContentService contentservice, INavigation nav) 
        { 
         this.navigation = nav; 
         this.contentService = contentservice; 
         SetCategoriesAsync(); 
        } 
    
        private async Task SetCategoriesAsync() 
        { 
         var response = await this.contentService.GetCategories(); 
         this.Categories = (from c in response 
           select new CategoryItem() 
           { 
            //code removed but you get the idea 
           }).AsEnumerable(); 
        } 
    } 
    
  • My MainPage.xaml. cs имеет следующие строки в конструкторе. Я не думаю, что здесь есть какая-то проблема.

    this.MainViewModel = new MainViewModel(contentService, navService); 
    this.CategoriesList.ItemsSource = this.MainViewModel.Categories; 
    
  • По this link, я уже добавил ссылки через NuGet в следующих библиотеках в порядке появления: Microsoft.BCL, Microsoft.BCL.Build, Microsoft.Net.Http

  • I 'm не использует ModernHttpClient. Я планирую сделать это, как только у меня будет HttpClient, поскольку я считаю, что это улучшает производительность.

Любая помощь по этому вопросу будет принята с благодарностью.

+0

Включить все исключения из https://msdn.microsoft.com/en-us/library/x85tt0dd.aspx и посмотреть, есть ли у вас в GetAync. –

ответ

1

У меня была эта точная проблема, и она вызвана тупиком. Как вы называете этот метод? Обычно я хожу:

Device.BeginInvokeInMainThread(async() => 
{ 
    var categoriesList = await GetCategories(); 
}); 

Или, если он находится внутри вашего View Model, вы можете использовать Task.Run();

Избегайте использования .Result и таймеров в интерфейсе даже обработчики событий могут привести к тупиков, как этот.

Надеюсь, это поможет.

+0

Привет Марио, Немного поздно, но спасибо за ваш ответ. Ваше предложение об использовании Task.Run() все время работало. –

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