Ho un'esperienza recente che vorrei condividere che potrebbe essere utile a chiunque debba mantenere un servizio Web ASMX legacy che deve essere aggiornato per richiamare i metodi basati su attività.Chiamare i metodi basati su attività da ASMX
Ho recentemente aggiornato un progetto ASP.NET 2.0 che include un servizio Web ASMX legacy in ASP.NET 4.5. Come parte dell'aggiornamento, ho introdotto un'interfaccia API Web per consentire l'automazione avanzata dell'applicazione. Il servizio ASMX deve coesistere con la nuova API per la retrocompatibilità.
Una delle funzioni dell'applicazione è quella di poter richiedere dati da fonti di dati esterne (storici di impianti industriali, servizi Web su misura, ecc.) Per conto del chiamante. Come parte dell'aggiornamento, ho riscritto parti sostanziali del livello di accesso ai dati per richiedere in modo asincrono i dati utilizzando un modello asincrono basato su attività. Dato che non è possibile utilizzare aync/await in un servizio ASMX, ho modificato i metodi ASMX per effettuare chiamate di blocco ai metodi asincroni, ovvero chiamare il metodo basato su Task e quindi utilizzare Task.WaitAll per bloccare il thread fino al completamento dell'attività.
Quando si chiama un metodo ASMX che stava chiamando un metodo che restituisce Task o Task <T> sotto il cofano, ho trovato che la richiesta è sempre scaduta. Quando ho passato il codice, ho potuto vedere che il codice asincrono era in esecuzione, ma la chiamata a Task.WaitAll non ha mai rilevato che l'attività era stata completata.
Ciò ha causato un forte mal di testa: come potrebbe il servizio ASMX coesistere felicemente con le nuove funzionalità di accesso ai dati asincroni?
Alcune informazioni davvero utili in là - grazie! Preferirei non apportare modifiche sostanziali all'interfaccia del servizio web (ad esempio, convertirlo per utilizzare l'APM), ma utilizzando Task.Run è sicuramente un modo migliore per evitare il deadlock. Ho anche usato ConfigureAwait (false) ovunque sia possibile, anche se la natura della bestia è che non posso garantire che venga sempre utilizzata, dal momento che alcuni dei driver di origine dati potrebbero, in teoria, essere scritti da Terze parti in futuro. –
Se usi 'Task.Run', perdi * tutti * i vantaggi del codice asincrono. Ovviamente è una tua chiamata, ma tieni presente che, a meno che tu non faccia l'asma asincrono ASM (APM), non ottengono nessuno dei vantaggi del codice asincrono (come la scalabilità). –
Capito. Al momento, ci sono un paio di applicazioni che usano il servizio ASMX; l'intenzione è quella di migrare questi per utilizzare l'API Web, quindi al momento stiamo solo cercando la compatibilità più di ogni altra cosa. Inoltre, l'ASMX è stato sinora sincrono fino ad ora, quindi è un caso di "non guadagnare" benefici asincroni piuttosto che perderli. Le nuove applicazioni che utilizzano l'app Web lo fanno in modo asincrono, tramite l'API Web. –