2016-07-10 11 views
1

Ich habe ein ASP.NET WebApi in Azure gehostet. Es gibt keine HTTP-Header-basierte oder Azure-API-Authentifizierung auf ihm und Fiddler-Sitzungen beweisen, dass die API voll funktionsfähig ist und spuckt Daten wie angefordert und erwartet aus.Xamarin Formulare HttpClient GetAsync

In meiner Xamarin Formen (PCL, iOS & nur Android) PCL-Projekt, ich habe in einer Serviceklasse den folgenden Code ein:

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

ich den Code und bemerkte gedebuggt haben, dass die Steuerung nicht vorbei geht :

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

und als Ergebnis bleibt categoryLinks null.

Hat jemand schon mal darüber gestolpert?

Ein paar Dinge zu beachten:

  • Obwohl ich, wenn es Zweifel irgendein Problem hier, aber ich habe eine MainViewModel Klasse, sieht wie folgt aus:

    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(); 
        } 
    } 
    
  • Mein MainPage.xaml. cs hat die folgenden Zeilen im Konstruktor. Ich denke nicht, dass es auch hier ein Problem gibt.

    this.MainViewModel = new MainViewModel(contentService, navService); 
    this.CategoriesList.ItemsSource = this.MainViewModel.Categories; 
    
  • Per this link, ich habe bereits Referenzen über nuget auf die folgenden Bibliotheken in der Reihenfolge des Erscheinens hinzugefügt: Microsoft.BCL, Microsoft.BCL.Build, Microsoft.Net.Http

  • I verwende den ModernHttpClient noch nicht. Ich plane dies zu tun, sobald ich HttpClient arbeite, da ich glaube, dass es die Leistung verbessert.

Jede Hilfe zu diesem wird sehr geschätzt.

+0

Aktivieren Sie alle Ausnahmen von https://msdn.microsoft.com/en-us/library/x85tt0dd.aspx und sehen Sie, ob Sie eine auf dem 'GetAsync' erhalten. –

Antwort

1

Ich hatte dieses genaue Problem, und es wird durch einen Deadlock verursacht, Wie nennst du diese Methode? ich in der Regel gehen:

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

Oder wenn es in Ihrer Ansicht Modell ist, können Sie Task.Run();

Vermeiden Sie .RESULT und Timer in Ihrem UI auch Ereignisse Handler Deadlocks wie diese verursachen verwenden.

Hoffe, das hilft.

+0

Hallo Mario, ein wenig spät, aber danke für Ihre Antwort. Ihr Vorschlag zur Verwendung von Task.Run() im gesamten Verlauf funktioniert. –

Verwandte Themen