2017-01-09 3 views
0

J'ai créé deux projets dans une même solution, un pour l'application mvc et l'autre pour l'API web.Appel Webapi à partir de l'application mvc

Lorsque j'appelle ma méthode web api de PostMan ou de n'importe quel HttpClient, je peux recevoir la réponse comme prévu.

Toutefois, lorsque j'appelle la même méthode dans l'application MVC, l'application continue à fonctionner sans réponse reçue. Aucune exception spécifique n'est enregistrée ou affichée par Visual Studio.

J'ai copié le code que j'utilise pour référence. Toute aide sera grandement appréciée.

public class UserFacade 
{ 
    HttpClient _client; 
    string url = "http://localhost:50759/api/v1/login"; 
    public void LoginUser(string userName, string password) 
    { 
     _client = new HttpClient 
     { 
      BaseAddress = new Uri(url) 
     }; 

     _client.DefaultRequestHeaders.Accept.Clear(); 
     _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

     var model = new UserModel 
     { 
      UserName = userName, 
      UserPassword = password 
     }; 

     var userModel = JsonConvert.SerializeObject(model); 
     var content = new StringContent(userModel, Encoding.UTF8, "application/json"); 

     GetUserTask(_client, content).Wait(); 

    } 

    private async Task GetUserTask(HttpClient client, StringContent content) 
    { 
     using (client) 
     { 
      HttpResponseMessage res = await client.PostAsync(url, content); 
      res.EnsureSuccessStatusCode(); 
      if (res.IsSuccessStatusCode) 
      { 
       var response = await res.Content.ReadAsStringAsync(); 

       JavaScriptSerializer JSserializer = new JavaScriptSerializer(); 
       //deserialize to your class 
       //var userResponse = JSserializer.Deserialize<UserResponse>(response); 

      } 
     } 
    } 

} 

Juste pour les informations que j'ai fait deux projets de démarrage dans la solution et l'exécution du code à partir de là.

Répondre

1

Vous êtes vous-même dans l'impasse. Assurez-vous que vous ne capture pas le contexte lors de l'appel async:

private async Task GetUserTask(HttpClient client, StringContent content) 
{ 
    using (client) 
    { 
     HttpResponseMessage res = await client.PostAsync(url, content).ConfigureAwait(false); 
     res.EnsureSuccessStatusCode(); 
     if (res.IsSuccessStatusCode) 
     { 
      var response = await res.Content.ReadAsStringAsync().ConfigureAwait(false); 
     } 
    } 
} 

Notez le .ConfigureAwait(false) que je l'ai ajouté à la fois vos appels asynchrones.

Cela dit, il est une perte à fait un appel asynchrone, puis le bloquer comme ceci:

GetUserTask(_client, content).Wait(); 

Vous tuez absolument tous les avantages des appels asynchrones. Je recommande très fortement d'utiliser la version async du code:

public async Task LoginUser(string userName, string password) 
{ 
    _client = new HttpClient 
    { 
     BaseAddress = new Uri(url) 
    }; 

    _client.DefaultRequestHeaders.Accept.Clear(); 
    _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

    var model = new UserModel 
    { 
     UserName = userName, 
     UserPassword = password 
    }; 

    var userModel = JsonConvert.SerializeObject(model); 
    var content = new StringContent(userModel, Encoding.UTF8, "application/json"); 

    await GetUserTask(_client, content); 
} 

puis bien sûr avoir une action du contrôleur d'action async qui consommera la méthode async:

public async Task<ActionResult> Index() 
{ 
    await new UserFacade().LoginUser("user", "secret"); 
    return View(); 
} 
+0

Merci Darin pour l'aide . –