Korrekte Verwendung von Warte-Async in Webapi

8

Ich habe einen WebApi, der für jede eingehende Anfrage zwei getrennte Webdienste aufruft, einige Nachbearbeitungen durchführt und die Ergebnisse zurückgibt.

Der erste Webservice-Aufruf wird lokal für 1 Stunde zwischengespeichert, und die Daten in diesem bestimmen die Abfrage für den zweiten Webservice. Der 2. Webservice wird bei jeder eingehenden Anfrage aufgerufen. Nach der zweiten Anforderung wird jedes Ergebnis mit Geschäftslogik verarbeitet und an die Clientantwort zurückgegeben.

Der Aufruf an den zweiten Webservice kann nicht asynchron sein, da er eine Drittanbieter-DLL verwendet, die das await-Schlüsselwort nicht zulässt. Was ich getan habe, ist der 2. Webservice-Aufruf und die Nachbearbeitung in eine Async-Funktion verpackt, die vom Controller aufgerufen wird.

%Vor%

Da der Aufruf des ersten Webdienstes lokal zwischengespeichert wird, sehe ich keinen großen Vorteil darin, dieses asynchrone Verfahren durchzuführen.

Ich bin nur auf der Suche, ob dieser Ansatz völlig falsch ist, oder richtig.

    
mickyjtwin 13.08.2013, 05:39
quelle

2 Antworten

8
  

Der erste Webservice-Aufruf wird lokal für 1 Stunde zwischengespeichert, und die Daten in diesem bestimmen die Abfrage für den zweiten Webservice.

Sie können ein paar Tricks mit AsyncLazy<T> machen (zB von meinem Blog ) ) und cache das stattdessen. Dadurch erhalten Ihre Anforderungen eine Möglichkeit, (asynchron) auf eine Aktualisierung zu warten, und Sie werden Service1 nicht mehrmals treffen, wenn Sie die Daten unabhängig von der Anzahl der gleichzeitigen Anforderungen aktualisieren müssen.

  

Der Aufruf an den zweiten Webservice kann nicht asynchron sein, da er eine Drittanbieter-DLL verwendet, die das await-Schlüsselwort nicht zulässt.

Das ist ein Mist. Lehne dich darauf, um es zu reparieren. :)

  

Was ich getan habe, ist der zweite Webservice-Aufruf und die Nachbearbeitung in eine asynchrone Funktion, die vom Controller aufgerufen wird.

Das hat keinen Sinn. Der Compiler warnt Sie, dass Ihre "async" -Methode tatsächlich synchron ist.

Wenn es synchron ist, rufen Sie es einfach synchron auf. Auf der Serverseite hat es keinen Sinn, sie in Task.Run oder etwas Ähnliches einzufügen.

Ich habe einige Slides von einem "Async auf dem Server" -Talk verfügbar Ich gab Montag bei ThatConference , was Sie vielleicht hilfreich finden. (Sie haben Animationen, wie asynchrone Anfragen behandelt werden und warum "falsche asynchrone" Methoden auf der Serverseite nicht helfen).

    
Stephen Cleary 14.08.2013 23:05
quelle
0

Um die Funktion Search wirklich asynchron zu machen, kann der Aufruf von SomeApi.Search in eine separate Task eingebunden und dann abgewartet werden. Ziehen Sie außerdem in Betracht, den Code in der ersten Funktion in eine Aufgabe zu integrieren, wobei Ihre Cache-Validierung für die Lastschätzungen auch einen Engpass darstellen könnte.

%Vor%     
Alex S 14.08.2013 14:59
quelle