Se questo processo richiede davvero molto tempo, puoi anche considerare di interrompere il lavoro a lungo termine.
Ad esempio, quando la richiesta viene gestita dall'API Web, è possibile scrivere un messaggio in qualcosa come una coda messaggi e fare in modo che MSMQ sul server attivi un processo separato per eseguire qualsiasi operazione indicata da tale messaggio.
Il modo in cui questo lavoro può essere eseguito è di tipo ortogonale qui - forse una stored procedure funziona meglio nel tuo caso, o forse un'app di driver per eseguire la logica di business codificata in una libreria di classi, ecc. Il punto è che puoi fare questo lavoro senza doversi preoccupare di essere nel contesto di un thread di API Web: è possibile tornare immediatamente al client e non è necessario attendere il completamento del processo in esecuzione prolungata e non è necessario preoccuparsi di timeout sulla loro connessione, ecc.
Il chiamante può quindi eseguire il polling per l'aggiornamento dello stato sul lavoro, oppure è possibile utilizzare i socket Web per reindirizzare lo stato al chiamante o persino utilizzare una coda messaggi separata per scrivere i messaggi di completamento che il chiamante sta monitorando, ecc.
Ovviamente questo può funzionare solo se il chiamante è disposto ad accettare un flusso di lavoro completamente asincrono:)