J'utilise après que j'appelle quand Exécution de ce code, je vois l'exécution de la finition HTTP, mais le résultat Edit:
J'ai maintenant essayé une approche asynchratante mais cela ne m'a pas aidé aussi aussi p> httpclient code> essayer d'exécuter une méthode postale dans le contrôleur API Web. La méthode du contrôleur est synchrone. Je le fais de cette façon:
attendre code>: p>
code> est toujours faux. Que puis-je manquer? P>
TestServer _owinTestServer;
public async Task<HttpResponse message> Method1(string url, object body)
{
return await
_owinTestServer.HttpClient.PostAsJsonAsync(url,body);
}
public async Task<ItemPreview> Method2(object body);
{
return await Method1("..", body ).Result.Content.ReadAsAsync<ItemPreview>();
}
[TestMethod]
public void test1()
{
Item item = new(...);
Method2(item).Continue with(task => {// Never reach here }
}
4 Réponses :
Peu importe si la méthode du contrôleur est synchrone ou non. C'est purement une préoccupation sur le code du serveur. Depuis la méthode qui permettra à votre code d'attendre la réponse du serveur. p> p> postasjsonasync code> est asynchrone, vous devez
attendre code> IT:
Vous mélangez des appels asynchronisés et bloquants (c'est-à-dire Cela ressemble plus à ce qu'il s'agisse d'un problème de blocage du côté du client test. p> Vous devez effectuer le test ASYNC jusqu'à présent dans ce cas si vous souhaitez attendre des résultats du serveur. p> Convertir la méthode de test en ASYNC P> .result code>,
.wait () code>) qui conduit à une impasse.
public async Task<ItemPreview> Method2(object body) {
var response = await Method1("..", body );
return await response.Content.ReadAsAsync<ItemPreview>();
}
Je suppose que votre code initial avait l'air comme celui-ci ... et oui, le résultat sera faux après avoir attendu les 15 secondes. En effet, vous avez configuré la demande, alias la réponse, mais vous n'avez pas réellement rendu l'appelé et toute réponse. Await (n) retournera false. P> Vous avez juste besoin de démarrer le fichier ReadasaSync ... p> Cependant, je pense que vous trouverez que vous pouvez ignorer la réponse.Wait (n) tous ensemble, car il retournera vrai parce que le ReadasaSync () attendra de retourner ou échouer. Si vous souhaitez configurer le délai de requête, vous pouvez le faire dans le HTTPCLIPT et votre fichier ReadasaSync lancera une exception d'agrégate à une exception Innère de TaskCanceledException. P> sur une note latérale, vous n'avez pas besoin d'utiliser owin.httpclient Vous pouvez simplement instancier un nouveau httpClient. Je crois que l'objet Owin que vous parlez est d'accueillir votre webapi, je ne sais pas si cela importe. Mais disons que vous appelez ajouter (élément article) sur votre webapi et que db.additem (item) retournera et itemPreview objet, votre code pourrait ressembler à ceci: P> [TestMethod]
public void test1()
{
Item item = new(...);
var uri = "..";
var client = new HttpClient();
var response = client.PostAsJsonAsync(uri, item);
var itemPreview = response.Result.Content.ReadAsAsync<ItemPreview>();
/* The things to happen once you have item preview */
}
Le résultat peut toujours être faux car le _db.additem renvoie de faux tout le temps. Sinon, j'ai effectué une modification de votre code idéalement, ce qui devrait fonctionner pour vous
TestServer _owinTestServer; public async Task<HttpResponse message> Method1(string url, object body) { return await _owinTestServer.HttpClient.PostAsJsonAsync(url,body); } public async Task<ItemPreview> Method2(object body); { return await Method1("..", body ).Result.Content.ReadAsAsync<ItemPreview>(); } [TestMethod] public void test1() { Item item = new(...); await Method2(item).ContinueWith(task => {// Never reach here } }
Quel est le point d'appeler
attendre () code> si vous utilisez ASYNC API? Vous seriez mieux d'utiliser
attendre code>.
Parce qu'il n'ya aucun moyen de poster des données de manière synchrone en utilisant
httpclient code>, sinon je le ferais de manière synchrone. Pour une raison quelconque, j'ai eu une impasse lorsque j'ai essayé d'utiliser le
attendre code>
Tout d'abord, je ne recommanderais pas
attendre code> dans
async code>, toujours utiliser
attendre code>. Deuxièmement, veuillez poster le code complet qui cause une impasse, de cette façon, nous pouvons trier quel est le problème réel au lieu de mélanger le blocage et le code non bloquant.
@ Razort4x j'ai posté mon code