2013-03-08 3 views
1

Je rencontre un problème lors de l'appel de la classe HttpClient et de l'appel asynchrone. J'appelle la fonction List() de page_load. Les appels reviennent de la ligne HttpResponseMessage response = attendent client.GetAsync (str); et ne revient jamais pour le finir.Appel HttpClient dans asp.net

Je ne comprends pas quelle erreur je fais. Voici mon code:

 protected void Page_Load(object sender, EventArgs e) 
     { 
      Task<string> s= List(product); 
     } 

     protected async Task<string> List(string ProductType) 
     { 
      string str = "http://xx.xx.com/wiki/api.php"; 


      using (HttpClient client = new HttpClient()) 
      { 
       client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes(String.Format("{0}:{1}", "username", "password")))); 
       HttpResponseMessage response = await client.GetAsync(str); 

       response.EnsureSuccessStatusCode(); 

       string content = await response.Content.ReadAsStringAsync(); 
      } 
      return content; 
     } 

Il n'exécute jamais les lignes suivantes.

response.EnsureSuccessStatusCode(); 
string content = await response.Content.ReadAsStringAsync(); 

Aidez-nous s'il vous plaît. Merci d'avance.

Répondre

1

Vous ne montrent jamais ce qui se passe à la tâche Page_Load, mais compte tenu de vos symptômes et le fait que Page_Load n'est pas async, je parie que vous appelez Result ou Wait au lieu de await ing il.

Lorsque vous faites cela, vous cause a deadlock. Le lien vers mon blog explique cela en détail, mais l'essentiel est que await va capturer et restaurer le "contexte" actuel. Dans ASP.NET, il s'agit d'un contexte de requête, et le contexte de requête n'autorise qu'un thread s'exécutant à la fois. Ainsi, si vous appelez Result ou Wait (pendant que vous êtes dans le contexte de la requête), vous allez bloquer un thread dans ce contexte de requête jusqu'à ce que le Task<string> soit terminé. Pendant ce temps, lorsque le HttpClient obtient sa réponse, il tente de reprendre après le await client.GetAsync(str). Mais le contexte de requête n'autorise qu'un seul thread à la fois, et ce thread est bloqué en attendant que le Task se termine. Depuis List ne peut pas terminer parce que le contexte est occupé, vous avez un blocage.

Pour éviter les blocages, suivez ces deux best practices (from my recent MSDN article):

  1. Utilisez async tout le chemin. Autrement dit, utilisez await au lieu de Result ou Wait.
  2. Utilisez ConfigureContext(false) dans votre code, à savoir tous les await en List devrait effectivement être await ... .ConfigureAwait(false);
+0

"bibliothèque" Merci Stephen pour me aider. Ça aide. – Hiral