4

Wir haben eine Restful-Client-Sever-Umgebung und ich versuche, meinen Code zu debuggen, wo Client-Code wie folgt aussieht:Steuerung nicht zurück auf das erwartete WebClient kommt nach Async WebAPI Aufruf

await Client.DoWork(Id); 

Während Server-Code aussieht wie folgt vor:

public virtual async Task<IActionResult> DoWork(long Id) 
{ 
    return Ok(); 
} 

Bitte beachten Sie, dass der Kunde ein Webclient für den Dienst ist, die von https://github.com/swagger-api/swagger-codegen Code automatisch generiert wird.

Der Punkt in automatisch generierten Code, der es nie wieder wie kommt sieht aus wie folgt:

var response_ = await client_.SendAsync(request_, 
    System.Net.Http.HttpCompletionOption.ResponseHeadersRead, 
    cancellationToken).ConfigureAwait(false); 

Dies ist, wo die Steuer

  • Eine Sache, die nicht hilfreich sein kann, ist weg oder Hier ist, dass die Service-Anrufe einen Proxy durchlaufen. Nicht sicher, ob das etwas ändert

Wenn Client-Aufruf der API ich sehen kann, es zu Return OK() geht und ich in Fiddler sehen, dass es zurückgeben 200OK hat aber die Kontrolle kommt nie zurück Methode aufrufen. Wie kann ich das lösen?

+3

Das bedeutet normalerweise Deadlock. Die Natur hängt von der Umwelt ab. Zum Beispiel könnte es sich bei Ihrem Client um eine UI-Anwendung (wie WPF oder Win Forms) oder eine asp.net-Anwendung handeln, und Sie tun etwas wie Task.Wait oder Tadk.Result irgendwo auf dem Stapel. – Evk

+0

Es ist ein WebClient und wir verwenden Swagger mit 'ConfigureAwait (false)'. Ich dachte, dass es ausreichen sollte. – TeaLeave

+0

Wenn Sie das von asp.net-Anwendung aufrufen - das obige gilt immer noch. Schwer zu sagen mehr ohne mehr Code und Informationen (was genau ist Client, wie es api nennt, was ist in diesem Client.DoWork und so weiter). – Evk

Antwort

3

Sie haben bereits festgestellt, dass das Hinzufügen von .Wait() zu Ihrer asynchronen Methode in der Konsolenanwendung das Problem löst. Hier ist eine gute Antwort auf How Async and Await works. Und der Artikel in der Antwort erwähnt Async and Await.

Wenn der await-Operator eine unvollständige Aufgabe übergeben wird ... dann wird standardmäßig await den aktuellen Kontext erfassen und eine unvollständige Aufgabe von der Methode zurückgeben.

Also im Grunde, wenn Client async-Kommunikation mit Server-Methode starten gibt unvollständige Aufgabe zurück. Und da es in Main nicht erwartet wird, beendet Methoden-Konsolenanwendung, bevor Client Antwort von dem Server erhält.

Es gibt keine SynchronizationContext in Konsolenanwendung, so dass es sicher ist .Wait() Methode oder .Result Eigenschaft verwenden Thread in Main Verfahren zu blockieren, bis vervollständigt async Betrieb.

Verwandte Themen