HttpClient PostAsync() retournera jamais de réponse
Mon problème est très similaire à ce question ici. J'ai un authenticationService Classe qui fait un HttpClient PostAsync() et ne jamais retourner le résultat quand je suis en cours d'exécution à partir de l'ASP projet, mais quand je la mettre en œuvre sur une Console Application, elle fonctionne très bien.
C'est mon Service d'Authentification de Classe.
public class AuthenticationService : BaseService
{
public async Task<Token> Authenticate (User user, string url)
{
string json = JsonConvert.SerializeObject(user);
StringContent content = new StringContent(json, Encoding.UTF8, "application/json");
HttpResponseMessage response = await _client.PostAsync(url, content);
string responseContent = await response.Content.ReadAsStringAsync();
Token token = JsonConvert.DeserializeObject<Token>(responseContent);
return token;
}
}
Et c'est là où il se bloque
HttpResponseMessage response = await _client.PostAsync(url, content);
Voici mon Contrôleur d'appeler le service
public ActionResult Signin(User user)
{
//no token needed to be send - we are requesting one
Token token = _authenticationService.Authenticate(user, ApiUrls.Signin).Result;
return View();
}
Voici un exemple de la façon dont j'ai été tester le service en utilisant une Application de Console et il fonctionne très bien.
class Program
{
static void Main()
{
AuthenticationService auth = new AuthenticationService();
User u = new User()
{
email = "[email protected]",
password = "password123"
};
Token newToken = auth.Authenticate(u, ApiUrls.Signin).Result;
Console.Write("Content: " + newToken.user._id);
Console.Read();
}
}
Je vous remercie d'avance pour votre aide.
OriginalL'auteur Erik | 2015-12-03
Vous devez vous connecter pour publier un commentaire.
Depuis que vous utilisez .Résultat cela finira par causer un blocage dans votre code. La raison de ce qui est de travailler dans une application console est parce que les applications de console de ne pas avoir les contextes, mais ASP.NET applications faire (voir http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html). Vous devez en faire la Signin méthode dans votre contrôleur async et await l'appel à _authenticationService.Authentifier pour résoudre le problème de blocage.
OriginalL'auteur Josh Dammann
Au cas où quelqu'un vient et a besoin de voir le code je viens de changer le contrôleur à quelque chose comme ceci:
Merci à vous tous pour votre réponse rapide!
OriginalL'auteur Erik
Puisque vous utilisez
.Result
ou.Wait
ouawait
cela finira par causer une impasse dans votre code.vous pouvez utiliser
ConfigureAwait(false)
dansasync
méthodes pour la prévention de blocagecomme ceci:
La source que vous citez ci-dessus dit aussi: "Utilisation de ConfigureAwait(faux) pour éviter les blocages est une pratique dangereuse. Vous devez utiliser ConfigureAwait(false) pour tous les attendent dans la fermeture transitive de toutes les méthodes appelées par le code de blocage, y compris tous les troisième et de seconde partie de code. À l'aide de ConfigureAwait(faux) pour éviter un blocage est, au mieux, juste un hack)."
msdn.microsoft.com/en-us/magazine/jj991977.aspx Cet article explique bien quand ConfigureAwait doit être utilisé et ce qu'il faut savoir.
OriginalL'auteur Hasan Fathi