Sto costruendo una libreria di registrazione che memorizza tutto su una tabella di Azure. Scrivendo a quel tavolo prende ovviamente un sacco di tempo (non più di 1 secondo, ma è ancora troppo da rendere l'utente di attesa), quindi il metodo Log restituisce un'istanza LogResult, ecco la classeImpedire a IIS di uccidere un'attività prima che termini
public class LogResult
{
public string Id { get; set; }
public Task LoggingTask { get; set; }
public LogResult(string id, Task task)
{
Id = id;
LoggingTask = task;
}
}
Ed ecco come il metodo Log finisce
return new LogResult(id, Task.Factory.StartNew(() =>
DoLogInAzure(account, id, exception, request))
);
per dare al chiamante la possibilità di aspettare che sia completato (se si tratta di una console app, per esempio). Il problema che sto affrontando è che IIS non dovrebbe attendere prima di riportare l'utente la risposta ... e se non aspettare che, IIS non sempre eseguire l'operazione. L'idea è di mostrare all'utente un messaggio "... Se ci contatti, assicurati di menzionare il numero del tuo problema, XXX" e non farlo aspettare fino a quando non è stata scritta la voce del registro.
Esiste un modo per imporre a IIS di attendere fino al termine dell'attività, anche dopo aver restituito la risposta? Sto pensando che potrebbe essere necessario codificare un servizio di Windows che accetta la richiesta in modo asincrono, ma sembra molto lavoro solo per aggiungere una voce di log ... specialmente se posso forzare IIS ad aspettarlo.
Grazie per qualsiasi idea!
Ho sentito che IIS riavvia i "siti web" che occupano troppa memoria ... –
Capisco :) tuttavia, non penso che sia il mio caso, come se attendessi che l'attività finisse, IIS termina il l'esecuzione e la voce del registro sono scritte al 100% delle volte – g3rv4
In alternativa, è possibile utilizzare solo una coda azzurra per accedere. Quindi un gestore di messaggi separato può scrivere in modo asincrono sulla tabella azzurra. Ancora meglio, se si verifica un errore durante l'elaborazione, il messaggio rimane in coda e verrà elaborato nuovamente in seguito. –