2017-01-28 6 views
4

Ich mache Aufrufe an eine externe API und möchte mit dem Ereignis umgehen, dass ein Anruf eine HttpResponseMessage zurückgibt. In diesem Fall möchte ich das Zugriffstoken aktualisieren und den Anruf erneut durchführen.Verwenden von Polly, um nach HttpStatusCode.Unauthorized erneut zu versuchen

Ich versuche Polly mit dem folgenden Code zu verwenden:

public async Task<HttpResponseMessage> MakeGetRequestAsync() 
    { 
     var retryPolicy = Policy 
      .HandleResult<HttpResponseMessage>(r => r.StatusCode == HttpStatusCode.Unauthorized) 
      .Retry(1, (exception, retryCount) => 
      { 
       RefreshAccessToken(); 
      }); 

     var result = await retryPolicy.ExecuteAsync(() => CallApiAsync()); 

     return result; 
    } 


    private async Task<HttpResponseMessage> CallApiAsync() 
    { 
     var url = Options.ResourceSandboxUrl; 

     var httpClient = new HttpClient(); 
     SetRequestHeaders(httpClient); 
     var response = await httpClient.GetAsync(url); 

     response.StatusCode = HttpStatusCode.Unauthorized; 
     return response; 
    } 

Ich habe Haltepunkte auf der ExecuteAsync Anweisung und in DoSomethingAsync - wenn ich über ExecuteAsync Schritt DoSomethingAsync nicht aufgerufen wird und die Steuerung wird zurück die Funktion, die MakeGetRequestAsync

ich verstehe nicht, warum DoSomethingAsync genannt wird nicht genannt - kann mir jemand helfen mit was ich versuche zu erreichen?

Ich habe & Polly Fragen auf Stack-Überlauf an der Polly Dokumentation aussehen, aber ich kann nicht herausfinden, was los ist ..

Antwort

4

Um ExecuteAsync() verwenden Sie die Richtlinie als .RetryAsync(...) erklären müssen, nicht .Retry(...).

Wenn Ihr eigentlicher Code liest genau wie das obige Codebeispiel wird die .ExecuteAsync(...) für die Diskrepanz zwischen .Retry(...) [a sync Politik] und .ExecuteAsync(...) werfen wird [eine asynchrone Ausführung]. Da diese Ausnahme ausgelöst wird, wird CallApiAsync() tatsächlich nie aufgerufen. Sie sollten in der Lage sein, die ausgelöste Ausnahme beim Aufruf zu sehen MakeGetRequestAsync()

Gesamt-Code Ansatz sieht gut aus tho: diese Wiederholung-aktualisieren-Authentifizierung ist ein !

+0

Vielen Dank !!! –

+0

Ich verwende das gleiche Wiederholungsmuster und bekomme die Ausnahme als "Bitte verwenden Sie asynchrone Richtlinien beim Aufruf von asynchronen ExecuteAsync (und ähnlichen) Methoden.". Ich habe mir den Kopf gebrochen, um zu verstehen, was schief gelaufen ist ... und du hast mich gerettet. Vielen Dank..!! – Thangadurai

1

dies ist, wie async Arbeit in .net erwarten, wenn die Ausführung des Codes erreicht eine await werden zwei Dinge passiert

  1. sollte der aktuelle Thread des Codes freigeben, um Ihren Code async zu machen, das bedeutet, sollten Sie Ihre Methode

  2. wenn die Aufgabe zurückkehren Sie erwarten abgeschlossen ist, sollten Sie Ihre Methode aus fortsetzen, wo es verwendet

+0

Danke, wie schreibe ich diesen Code, um zu tun, was ich will? –

+0

All dies gilt für Async-Ausführungen, aber nichts davon ist relevant, warum der Aufruf des Benutzers an CallApiAsync() nicht über Polly erfolgte. –

Verwandte Themen