En un sitio web ASP.NET, ¿las clases estáticas son exclusivas de cada solicitud web, o se crean instancias siempre que sea necesario y GCed cada vez que el GC decide deshacerse de ellas?¿Las instancias de clases estáticas son únicas para una solicitud o un servidor en ASP.NET?
La razón por la que pregunto es porque he escrito algunas clases estáticas antes en C# y el comportamiento es diferente de lo que hubiera esperado. Hubiera esperado que las clases estáticas fueran únicas para cada solicitud, pero no parece que sea así.
Si no son exclusivas de cada solicitud, ¿hay alguna manera de permitir que lo estén?
ACTUALIZACIÓN:
El driis respuesta me dio fue exactamente lo que necesitaba. Ya estaba usando una clase singleton, sin embargo, estaba usando una instancia estática y, por lo tanto, estaba siendo compartida entre las solicitudes, incluso si los usuarios eran diferentes, lo que en este caso era algo malo. Usar HttpContext.Current.Items
resuelve mi problema perfectamente. Para cualquier persona que se topa con esta pregunta en el futuro, aquí está mi aplicación, simplificado y abreviado para que sea fácil de entender el patrón:
using System.Collections;
using System.Web;
public class GloballyAccessibleClass
{
private GloballyAccessibleClass() { }
public static GloballyAccessibleClass Instance
{
get
{
IDictionary items = HttpContext.Current.Items;
if(!items.Contains("TheInstance"))
{
items["TheInstance"] = new GloballyAccessibleClass();
}
return items["TheInstance"] as GloballyAccessibleClass;
}
}
}
Solo un aviso: si redirigir su solicitud, digamos, con 'filterContext.Result = new RedirectResult (...)' perderá sus elementos porque se creará un nuevo HttpContext. Más detalles aquí: https://stackoverflow.com/questions/16697601/response-redirect-does-not-preserve-httpcontext-current-items –