2012-01-01 7 views
10

Estoy usando un mecanismo patentado de IoC en mi aplicación asp.net mvc3 (en IIS7) que guarda el estado en campos [ThreadStatic] y por lo tanto se basa en la suposición de que HttpApplication.BeginRequest, HttpApplication.EndRequest y la ejecución sincrónica completa de la solicitud (única) con la que se relacionan se ejecuta en el mismo subproceso.asp.net mvc3 request thread affinity

¿Es esa suposición correcta?

Respuesta

9

¿Es esa suposición correcta?

No, esta suposición es not correct y hay evidence para ello. El único mecanismo confiable de almacenamiento por solicitud en ASP.NET es HttpContext.Items.

Nunca use [ThreadStatic] campos para almacenar valores por solicitud en una aplicación ASP.NET. Por ejemplo, si tiene un controlador asíncrono, es muy posible que el motor extraiga una solicitud del grupo de subprocesos para comenzar a atender la solicitud, inicie una operación asincrónica basándose en un IOCP (puerto de finalización de E/S) y finalmente extraiga otro subproceso de el grupo para terminar la solicitud Por lo tanto, podría tener 2 hilos diferentes que sirvan la misma solicitud HTTP.

Absolutamente nunca confíe en el hecho de que la solicitud HTTP será atendida por el mismo hilo.

Esto podría ser cierto en algunos casos para solicitudes síncronas, pero recuerde que esto es solo un detalle de implementación. Esto podría cambiar sin previo aviso de una versión de .NET a otra. Nunca debe confiar en él y nunca use [ThreadStatic] en ASP.NET. Esto podría morderte mucho.

+0

¿Existe alguna manera fácil de reproducir dicho comportamiento? – Rookian

+2

Guau, estoy muy conmocionado por esta respuesta, realmente creía que ASP.NET MVC estaba procesando cada solicitud por hilo. ¿Sigue siendo así con MVC 5? ¿Cómo se explica que es posible establecer Thread.CurrentThread.CurrentCulture para la aplicación multilingüe, si las solicitudes no se procesan por hilo? – reddy

+0

@reddy Por lo que sé, ASP.NET se ocupa de esos objetos (HttpContext, CurrentCulture, ...) y los transfiere de un hilo a otro. – Rookian