HttpClient.PostAsJsonAsync ne voit jamais quand le post est de réussir et de répondre
Nous sommes à l'aide d'un HttpClient pour poster json à un service web restful. Dans un cas, nous sommes en cours d'exécution dans quelque chose qui nous a épaté. En utilisant des outils comme le facteur, le violoneux, etc, nous pouvons placer à un point de terminaison et de voir qu'il est de travail. Lorsque nous faisons la même chose avec HttpClient.PostAsJsonAsync, nous pouvons vérifier dans le logiciel que nous envoyez des messages qu'il a reçu les données de l'amende juste. Cependant, notre PostAsJsonAsync pourrez perdre du temps plutôt que de nous donner une réponse.
Nous avons travaillé avec l'équipe qui a créé le service que nous consomment, en plus de nos autres tests de notre côté, et nous n'avons pas encore été en mesure de vraiment temps que service.
Chaque fois que nous faire un post avec HttpClient, on peut alors vérifier que le logiciel cible nous post n'a en effet d'obtenir les données. De tout temps nous faire un post pour que le logiciel cible de tout autre outil, nous avons toujours très rapidement une réponse avec le code d'état 200. Quelque chose à propos de HttpClient est de ne pas accepter la réponse de ce service particulier. Quelqu'un aurait-il une idée de ce que nous pouvons observer à partir d'ici?
Voici le code (mais il est tellement à l'emporte-pièce que je ne l'estimez nécessaire)
public string PostData(string resourcePath, Object o, Boolean isCompleteUrl = false, int timeoutMinutes = -1)
{
using (var client = new HttpClient())
{
if (timeoutMinutes > 0)
{
client.Timeout = new TimeSpan(0,timeoutMinutes,0);
}
var useUrl = isCompleteUrl ? resourcePath : ApiBase + resourcePath;
var response = client.PostAsJsonAsync(useUrl, o).Result;
if(response.StatusCode == System.Net.HttpStatusCode.OK)
{
return response.Content.ReadAsStringAsync().Result;
}
return "";
}
}
OriginalL'auteur Danny | 2015-06-04
Vous devez vous connecter pour publier un commentaire.
Ce:
Est à l'origine de la rédaction du code de blocage. C'est souvent le cas lorsque le blocage d'API asynchrone, et c'est pourquoi vous êtes en train de vivre la "je ne vois pas de réponse en retour" effet.
Comment est-ce causer une impasse? Le fait que vous êtes l'exécution de cette demande dans un environnement qui contient un contexte de synchronisation, peut-être l'une qui appartient à l'INTERFACE utilisateur. C'est l'exécution de la demande asynchrone, et quand la réponse arrive, il se poursuit par un IO achèvement thread qui tente de poste de la poursuite sur la même INTERFACE utilisateur de contexte, qui est actuellement bloqué par votre
.Result
appel.Si vous voulez faire une requête HTTP de manière synchrone, l'utilisation
WebClient
à la place. Si vous voulez prendre avantage de l'API asynchrone correctement, alorsawait
au lieu de bloquer avec.Result
.Parfois, les gens n'ont pas réellement de comprendre qu'ils sont mal à l'aide API asynchrone. Vous pouvez également aller à "raw" avec
HttpWebRequest
.Webclient est en train de faire la même chose. Je pense qu'il peut être .net code ne pas aimer un certificat auto-signé sur le test/mise en scène de l'instance du service que nous utilisons. Avoir une bête d'un temps de travailler sur la façon pour éliminer cette possibilité, ou de le réparer si c'est bien le problème.
Même la méthode synchrone invocation provoque le gel? Avez-vous essayé fiddlering la demande? Cela se produit si vous retirez la SSC et de l'utilisation
Http
?Ouais, je n'avais pas réalisé que nous sommes de l'accès au service via un proxy (mulesoft directeur de l'API). Si nous avons accès à ce service directement, nous pouvons obtenir webclient de travail. Quand nous allons à l'encontre de l'api du gestionnaire de proxy, nous sommes coincés. Nous sommes donc de circonscrire notre zone de problème.
OriginalL'auteur Yuval Itzchakov
J'ai eu le même problème et cette SORTE de réponse fixe pour moi.
En un mot, vous devez utiliser le
ConfigureAwait(false)
extension pour éviter le blocage:ConfigureAwait(false)
sur tout avant/sous votre.Result
appel. Pour cette raison, il est vu comme un peu fragile.OriginalL'auteur webStuff
Est-il une raison pourquoi vous n'êtes pas à la suite de la async attendent modèle? Vous êtes à l'appel d'une méthode asynchrone, mais n'attend pas. Vous n'avez pas dit si le code appelant votre service REST est un Windows Forms ou ASP.NET application, mais que
.Result
est probablement vous causer des problèmes.Pouvez vous restructurez votre méthode comme ceci:
Je suis probablement aller à l'utilisation du client web étant que je ne veux pas qu'il se comporte de manière synchrone. J'avais lu que HttpClient était en fin de compte va déprécier client web, et qu'il était encore tout à fait réalisable pour le stuff. Suppose que j'ai lu de mal 🙂
J'ai été un fan de RestSharp avant la HttpClient a été introduit. Que pourrait être une autre option.
OriginalL'auteur Justin Helgerson
C'est une légère modification de @Justin Helgerson de la solution. Il y a 2 blocage
.Result
appels dans votre méthode; une fois que vous allez async vous devez les fixer à la fois.Remarque j'ai aussi renommé la méthode de
PostDataAsync
conformément à la APPUYEZ sur schéma..Result
appel.OriginalL'auteur Todd Menier
Qu'une seule ligne de code dans notre cas, le problème a été résolu. Un développeur d'une équipe différente offert cette suggestion, et il fonctionne. Je n'ai pas encore de google et de lire sur il suffit de proposer une explication de ce que c'est d'adressage.
OriginalL'auteur Danny