Aufruf von aufgabenbasierten Methoden aus ASMX
Ich möchte eine kürzlich gemachte Erfahrung mitteilen, die für jeden hilfreich sein kann, der einen älteren ASMX-Webdienst unterhalten muss, der aktualisiert werden muss, um aufgabenbasierte Methoden aufzurufen.
Ich habe kürzlich ein ASP.NET 2.0-Projekt aktualisiert, das einen älteren ASMX-Webdienst für ASP.NET 4.5 enthält. Als Teil des Updates habe ich eine Web-API-Schnittstelle eingeführt, um eine erweiterte Automatisierung der Anwendung zu ermöglichen. Der ASMX-Dienst muss aus Gründen der Abwärtskompatibilität mit der neuen API koexistieren.
Eine der Funktionen der Anwendung besteht darin, im Namen des Anrufers Daten von externen Datenquellen (Historiker von Industrieanlagen, maßgeschneiderte Webdienste usw.) abrufen zu können. Im Rahmen des Upgrades habe ich wesentliche Teile der Datenzugriffsebene neu geschrieben, um Daten mithilfe eines aufgabenbasierten asynchronen Musters asynchron anzufordern. Da es nicht möglich ist, aync / await in einem ASMX-Dienst zu verwenden, habe ich die ASMX-Methoden geändert, um Aufrufe an die asynchronen Methoden zu blockieren, d. H. Die aufgabenbasierte Methode aufzurufen und dann Task.WaitAll zu verwenden, um den Thread zu blockieren, bis die Aufgabe abgeschlossen ist.
Beim Aufrufen einer ASMX-Methode, die eine Methode aufrief, die Task oder Task <T> unter der Haube zurückgibt, stellte ich fest, dass die Anforderung immer eine Zeitüberschreitung aufwies. Als ich durch den Code schritt, konnte ich feststellen, dass der asynchrone Code erfolgreich ausgeführt wurde, der Aufruf von Task.WaitAll jedoch nie feststellte, dass der Task abgeschlossen war.
Dies verursachte erhebliche Kopfschmerzen: Wie konnte der ASMX-Dienst problemlos mit den neuen Funktionen für den asynchronen Datenzugriff zusammen existieren?