2011-02-09 4 views
5

Desidero scrivere un modulo http di registrazione che memorizzi un elenco di eventi di registro per una singola richiesta nella memoria locale del thread mentre viene eseguita la richiesta. Su End_Request voglio scrivere tutti gli eventi nella memoria persistente.Una singola richiesta Web su IIS rimane su un singolo thread?

La domanda è, una richiesta corrisponde a un thread? Cioè posso assumere da qualsiasi parte nel mio codice che posso aggiungere elementi al IEnumerable e saranno correttamente tutti insieme alla fine della richiesta.

risposta

5

No. ASP.NET può potenzialmente passare i thread durante l'elaborazione di una richiesta. Questo è noto come thread-agility.

Ci sono solo alcuni punti in cui può/lo farà. Non riesco a ricordare cosa sono in cima alla mia testa - alla ricerca di un riferimento ora ...

Ma la risposta breve è NO: non è possibile fare affidamento sulla stessa memoria locale thread accessibile per l'intera durata della richiesta.

+0

Non è vero. – SLaks

+1

@SLaks: cura di elaborare? – LukeH

+0

Le richieste ASP.Net non possono passare tra i thread. L'unico modo per farlo è usare Fibers, che .Net non supporta realmente. – SLaks

0

Il session rimane costante per la durata della richiesta. Perché non usarlo?

+0

La sessione non è per richiesta. – SLaks

+1

@Slaks wat? Come mai? – Will

4

Potrebbe essere meglio usare Context.Items anziché lo storage di thread, che è per richiesta. Non è necessario preoccuparsi di ciò che il server sta facendo con i suoi thread in questo modo.

0

Guarderei forse usando ELMAH o log4net per ottenere ciò che è necessario perché è semplice da utilizzare e ora è ancora più semplice da installare utilizzando il gestore pacchetti NuGet.

http://code.google.com/p/elmah/

http://logging.apache.org/log4net/

A volte è bello utilizzare il codice che è già testato e configurato per l'ambiente è necessario, piuttosto che a rotazione da soli, ma ehi che è la vostra chiamata.

+0

Non interessato a Elmah –

0

Se si è pronti a perdere potenzialmente i dati del registro accumulati, è possibile attendere fino alla fine della richiesta di scrittura nel registro, indipendentemente dalla sicurezza del thread. Se è importante per te che ogni evento venga registrato, ti suggerirei di scrivere gli eventi nel registro mentre si verificano.

+0

Lazaraus, questo è quello che intendo fare. La mia domanda è mirata a dove archiviare gli eventi del registro in memoria fino alla fine della richiesta. –