2012-01-01 8 views
10

Sto utilizzando un meccanismo proprietario IoC nella mia applicazione asp.net mvc3 (su IIS7) che salva lo stato nei campi [ThreadStatic] e quindi si basa su un'ipotesi che HttpApplication.BeginRequest, HttpApplication.EndRequest e l'intera esecuzione sincrona della (singola) richiesta a cui si riferiscono viene eseguita sullo stesso thread.asp.net mvc3 richiesta affinità thread

Questa supposizione è corretta?

risposta

9

Questa supposizione è corretta?

No, questa ipotesi è not correct e c'è evidence per esso. L'unico meccanismo di archiviazione affidabile per richiesta in ASP.NET è HttpContext.Items.

Non utilizzare mai i campi [ThreadStatic] per memorizzare valori per richiesta in un'applicazione ASP.NET. Ad esempio, se si dispone di un controller asincrono, è possibile che il motore esegua una richiesta dal pool di thread per iniziare a servire la richiesta, quindi avviare un'operazione asincrona basata su un IOCP (Porta di completamento I/O) e infine disegnare un altro thread da la piscina per completare la richiesta. Quindi potresti avere 2 thread differenti che servono la stessa richiesta HTTP.

Assolutamente mai fare affidamento sul fatto che la richiesta HTTP sarà servita dallo stesso thread.

Questo potrebbe essere vero in alcuni casi per le richieste sincrone, ma ricorda che questo è solo un dettaglio di implementazione. Questo potrebbe cambiare senza preavviso da una versione di .NET a un'altra. Non devi mai fare affidamento su di esso e non utilizzare mai [ThreadStatic] in ASP.NET. Questo potrebbe morderti molto male.

+0

C'è un modo semplice per riprodurre un simile comportamento? – Rookian

+2

Wow Sono molto scioccato da questa risposta, credevo davvero che ASP.NET MVC stava elaborando ogni richiesta per thread. È ancora il caso di MVC 5? Come si spiega che è possibile impostare Thread.CurrentThread.CurrentCulture per l'applicazione multilingue, se le richieste non vengono elaborate per thread? – reddy

+0

@reddy Per quanto ne so, ASP.NET si occupa di questi oggetti (HttpContext, CurrentCulture, ...) e li trasferisce da un thread all'altro. – Rookian