Die SituationMethode Voraussetzungen
Ich arbeite an einem OAuth2 Api Wrapper. Einige API-Routen sind für eingeloggte Personen und einige für anonyme und protokollierte. Hier
ist ein Beispiel für ein Verfahren, das in meinem Wrapper:
public async Task<UploadListResponse> List(bool pagination = false, int page = 1, int limit = 10)
{
var request = UploadRequests.List(pagination, page, limit);
var cancellationTokenSource = new CancellationTokenSource();
var restResponse = await Context.Client.ExecuteTaskAsync(request, cancellationTokenSource.Token);
return restResponse.Handle<UploadListResponse>();
}
Ich baue eine Anfrage alle Parameter einrichten dann die Anforderung auszuführen und dann behandeln die Antwort, falls ich einen api Fehler und dann ausgegeben ein Objekt, das alle Daten enthielt, die diese Anfrage hatte, gab mir.
Das Problem
Mit OAuth2, wenn Sie mit dem API einloggen werden Sie ein Zugriffstoken und eine Aktualisierungs-Token erhalten. Wenn Ihr Zugriffstoken abgelaufen ist, müssen Sie sich mit dem Aktualisierungs-Token an die API wenden, um ein neues neues Zugriffstoken zu erhalten.
Wie ich bereits sagte, einige meiner Methode muss man angemeldet sein, aber wenn Ihr Zugriffstoken abgelaufen Ich möchte versuchen, Token zu aktualisieren, bevor eine Ausnahme wie mit dieser Methode zu werfen:
public async Task<bool> NeedRelog()
{
try
{
var validAuth = await ValidAuth();
}
catch
{
try
{
var refresh = await Refresh(Context.Client.Config.RefreshToken);
}
catch
{
return true;
}
}
return false;
}
ValidAuth zu überprüfen mit die API, wenn Sie eingeloggt sind und wenn ich eine Ausnahme habe, dann werde ich versuchen, zu aktualisierenToken.
Ich möchte Methode, die protokolliert werden müssen, um NeedRelog() und diejenigen, die kein Tag sind, um es nicht aufzurufen, zu markieren.
Ich kann es nur in jeder Methode tun, aber es wäre nicht sauber.
Was ich bisher getan
Ich habe ein großartiges Werkzeug gefunden: Postsharp, dass meine Bedürfnisse zu passen scheint.
Ich habe angefangen, wie dies einen Checklog Aspekt zu tun:
[Serializable]
public class CheckLog : OnMethodBoundaryAspect, IOnStateMachineBoundaryAspect
{
public CheckLog()
{
ApplyToStateMachine = false;
}
public override void OnEntry(MethodExecutionArgs args)
{
var instance = (ApiService)args.Instance;
var res = instance.Parent.OAuth.NeedRelog().Result;
if (!res)
{
args.Exception = new Exception("Need to relog");
args.FlowBehavior = FlowBehavior.Return;
}
}
}
Wo ich
Das Hauptproblem ist, meine NeedRelog mit dem Anruf bin stecken() Methode. Aufgrund der Tatsache, dass dies eine asynchrone Methode ist, kämpfe ich darum, dass mein Aspekt darauf wartet.
Ich möchte wirklich wissen, diese Art von "bedingten Methodenaufruf" mit Postsharp zu verwenden, es sieht fantastisch aus, aber die Tatsache ist nach stundenlangem Suchen in der Dokumentation Ich habe keinen Weg gefunden, zu tun, was ich will .
Ich fange an mich zu fragen, ob es überhaupt möglich ist, das zu erreichen, was ich erreichen möchte.
Haben Sie versucht, eine Möglichkeit, den Anruf synchrone vielleicht mit so etwas wie http://stackoverflow.com/a/25097498/3131696? – M22an
Es funktioniert wie ein Charme für diese Code-Schnipsel, die mir geholfen haben zu verstehen, wie Async synchronisiert werden kann. ty mein Herr! –
Froh, dass dir @Sebastien geholfen hat – M22an