Vida útil de la variable estática de ASP.NET

Tengo algo de información en variables estáticas definidas en la clase de página (no en Global.asax). Solo declaro una variable en código como:

protected static int SomeGlobalUnsecureID; protected static string SomeGlobalUnsecureString; 

y define la variable en el evento PageLoad. Por ejemplo, verifico el ID de la base de datos, si es diferente de SomeGlobalUnsecureID, actualizo SomeGlobalUnsecureID y String desde otro lugar, de lo contrario los dejo tal como están. Esto es perfectamente seguro en mi aplicación. lógica (es decir, esos datos no son seguros, todos pueden acceder a ellos, no hay problema); lo único que quiero lograr es

  1. Mantenga la misma cantidad de memoria independientemente de los usuarios conectados

  2. Cambie si y solo si la información persistente es diferente de la que está en ‘memoria’ (porque leer la cadena me lleva mucho tiempo).

Ahora, desde que realizo el control en PageLoad, no tengo problemas en las páginas recargadas. Sin embargo, mi página está llena de WebMethods, y a veces veo que las variables estáticas se ponen a cero. Y la parte extraña es; la sesión todavía está activa incluso cuando las variables estáticas están puestas a cero (por lo tanto, no hay reinicio del servidor ni de la aplicación, etc.)

Esto es realmente extraño para mí. Supongo que la variable estática mantendrá su valor hasta que la aplicación (de alguna manera) finalice. Pero incluso la sesión no expiró, la variable estática se pone a cero. ¿Que sugieres? ¿El uso de variables de aplicación es una mejor opción? Todos los documentos que he leído en la web sugieren variables estáticas en lugar de variables de la aplicación. ¿Debo declararlas de alguna manera diferentes?

Las variables estáticas persisten durante la vida del dominio de la aplicación. Entonces, las dos cosas que provocarán que sus variables estáticas se “reinicien” son el reinicio de un dominio de aplicación o el uso de una nueva clase. En su caso con variables estáticas almacenadas en una clase de página aspx, puede perder las variables estáticas cuando ASP.NET decide recomstackr la página aspx en una nueva clase, reemplazando la clase de página anterior por la nueva.

Por esas razones, si el sistema decide reiniciar o reemplazar la clase ( .NET no mata ni descarga clases / ensambles en un dominio de aplicación en ejecución ), entonces sus variables estáticas se reiniciarán porque recibirá una nueva clase con el reinicio o el reemplazo. Esto se aplica tanto a aspx Pages como a las clases en la carpeta App_Code

ASP.NET reemplazará una clase si por algún motivo cree que es necesario volver a comstackrla ( consulte la comstackción dinámica de ASP.NET ).

No puede evitar la pérdida de variables estáticas desde el reinicio de un dominio de aplicación, pero puede intentar evitarlo reemplazando la clase. Podría poner sus variables estáticas en una clase que no sea una página aspx y no esté en el directorio App_Code. Es posible que desee colocarlos en una static class en algún lugar de su progtwig.

 public static class GlobalVariables { public static int SomeGlobalUnsecureID; public static string SomeGlobalUnsecureString; } 

Las variables estáticas son por grupo, es decir, si tiene 2 grupos que ejecutan su sitio asp.net, tiene 2 variables estáticas diferentes. ( Modo jardín web )

Las variables estáticas se pierden si el sistema reinicia su aplicación asp.net con una de esta manera.

  1. el grupo decide que necesita hacer una recomstackción.
  2. Abre el archivo app_offline.htm
  3. Usted hace el reinicio manual de la piscina
  4. El grupo alcanza algunos límites que ha definido y reinicia.
  5. Por alguna razón, reinicia el iis o el grupo.

Estas variables estáticas no son seguras para subprocesos y debe usar la palabra clave de locking especial si accede a ellas desde diferentes subprocesos.

Dado que el reinicio de una aplicación restablecerá sus estadísticas, pase lo que pase, si realmente desea conservar sus datos, debe almacenar los datos en una base de datos utilizando clases personalizadas. Puede almacenar información por usuario en estado de sesión con un modo de estado de sesión de base de datos . El estado / variables de la aplicación ASP.NET no lo ayudará porque están almacenados en la memoria, no en la base de datos , por lo que también se pierden en el reinicio del dominio de la aplicación.

Creo que los dos puntos siguientes también son importantes para la duración de las variables estáticas:

1 – En la configuración avanzada de su grupo de aplicaciones, verifique la configuración “Reciclaje” -> “Intervalo de tiempo regular (minutos)”. Su valor predeterminado es 1740, lo que significa que en cada 29 horas sus variables estáticas se pierden debido al reciclaje de su grupo de aplicaciones. Esta configuración se utiliza para la terminación de posibles memory leaks. No cambiaría esta configuración …

2 – En la configuración avanzada de su grupo de aplicaciones, verifique la configuración “Modelo de proceso” -> “Tiempo de espera inactivo (minutos)”. Su valor predeterminado es 20, lo que significa que en cada 20 minutos de inactividad en su grupo de aplicaciones, los procesos de trabajo finalizan / suspenden, lo que provocará la pérdida de las variables estáticas. Esta configuración se usa para liberar recursos cuando el grupo de aplicaciones no se utiliza en un cierto período de tiempo. Puede configurarlo a 0 para desactivar el tiempo de espera.

La variable estática se usa para almacenar todo el objeto por el mismo valor

 protected void Page_Load(object sender, EventArgs e) { sss s1, s2; s1 = new sss(); s1.TotalMark = 10; s2 = new sss(); s2.TotalMark = 20; sss.SchoolName = "St.Joseph's Hr.Sec.S"; //We can access through class and assign common to all s1.PrintData(); s2.PrintData(); } public class sss { public static string SchoolName { set; get; } public int TotalMark { set; get; } public string StudentName{set;get;} public void PrintData() { Console.WriteLine(TotalMark); Console.WriteLine(SchoolName); Console.WriteLine(StudentName); } }