none
Variable Global de Aplicación RRS feed

  • Pregunta

  • Muy buenas!

    Estoy haciendo una aplicación Web con ASP.NET en C# y llevo un tiempo con el mismo problema. Por más que he mirado por internet y he intentado cosas, no consigo que funcione como tiene que hacerlo. 

    El problema es el siguiente: 

    uno de los distintos tipos de usuario tiene el privilegio de poder activar una opción o no. Si ese usuario la activa, cambia parte del comportamiento de la aplicación web para todos los usuarios.
    Lo que en un principio hice fue utilizar la sección de app:Settings del Web.Config, pero nunca conseguí guardar los cambios al hacer Save(), y además leí que no era lo más correcto... (reinicio de toda la aplicación, ...)
    Lo segundo que intenté fue utilizar Application["nombreDeMiVariable"]. Aparentemente funcionaba, por lo menos durante un rato. El problema aquí vino cuando dejaba la aplicación con la opción desactivada, entraba a los 40 minutos y estaba desactivada. Esto tampoco resultó funcionar. 

    Lo último que he hecho ha sido una clase que contiene una variable. Cuando se activa o desactiva la opción a la que tiene acceso el tipo de usuario (administrador), se cambia el valor de esa variabe booleana. En el Application_Start asigno a Application["nombreDeMiVariable"] el valor de la variable contenida en la clase que he creado. Pensaba que esto funcionaba, pero he vuelto a comprobar que no. 

    No sé ya por donde mirar ni qué cambiar para conseguir lo que necesito. 

    Os dejo la parte del código que creo que es importante: 

    -- En la clase creada para guardar la variable --

    public class SiteVariables
    {
        public static bool myVariable;
        public static bool MyVariable
        {
            get { return myVariable; }
            set { myVariable = value; }
        }
    
    }


    -- Application_Start del Global.asax --

    void Application_Start(object sender, EventArgs e)
        {
            // Código que se ejecuta al iniciarse la aplicación
            Application["InventoryStatus"] = SiteVariables.myVariable;
    
        }


    -- Código del botón que guarda la configuración --

    if (checkboxInventory.Checked == true)
           {
               SiteVariables.myVariable = true;
               Application["InventoryStatus"] = SiteVariables.myVariable;
               
           }
           else
           {
               SiteVariables.myVariable = false;
               Application["InventoryStatus"] = SiteVariables.myVariable;               
           }

    Muchas gracias de antemano!

    jueves, 20 de agosto de 2015 9:36

Respuestas

  • Vamos a ver, puedes utilizar cualquiera de las dos opciones:

    Una variable de aplicación (Application["InventoryStatus"]) o una clase estática en la que almacenas el valor en una propiedad (SiteVariables.myVariable).

    En los dos casos vas a tener el mismo problema: el valor es global para toda la aplicación pero únicamente durante la vida de ésta. Cuando finaliza la aplicación el valor se pierde.

    Si quieres que el valor persista entre una ejecución de la aplicación y otra deberás usar un sistema de almacenamiento persistente: un archivo o una base de datos.

    Sí podrías utilizar el Web.config, pero no guardando el valor de forma inmediata puesto que (como has dicho) se reiniciaría la aplicación finalizando todas las sesiones activas. Podrías guardar el valor en el Web.config en el evento Application_End y recuperarlo en el Application_Start.

    Otra opción sería guardar el valor en un archivo diferente. Podrías por ejemplo crearte un archivo de texto con las opciones de la aplicación de forma que cuando se cambia el valor lo almacenas en este archivo, luego en el evento Application_Start podrías recuperar el valor de estas variables.

    Creo que esta última sería la mejor opción ya que el evento Application_End no te asegura que siempre se vayan a guardar los valores correctamente, ya que podría no ejecutarse cuando se produce una finalización inesperada de la aplicación.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta crsainz jueves, 20 de agosto de 2015 10:49
    jueves, 20 de agosto de 2015 9:51

Todas las respuestas

  • Vamos a ver, puedes utilizar cualquiera de las dos opciones:

    Una variable de aplicación (Application["InventoryStatus"]) o una clase estática en la que almacenas el valor en una propiedad (SiteVariables.myVariable).

    En los dos casos vas a tener el mismo problema: el valor es global para toda la aplicación pero únicamente durante la vida de ésta. Cuando finaliza la aplicación el valor se pierde.

    Si quieres que el valor persista entre una ejecución de la aplicación y otra deberás usar un sistema de almacenamiento persistente: un archivo o una base de datos.

    Sí podrías utilizar el Web.config, pero no guardando el valor de forma inmediata puesto que (como has dicho) se reiniciaría la aplicación finalizando todas las sesiones activas. Podrías guardar el valor en el Web.config en el evento Application_End y recuperarlo en el Application_Start.

    Otra opción sería guardar el valor en un archivo diferente. Podrías por ejemplo crearte un archivo de texto con las opciones de la aplicación de forma que cuando se cambia el valor lo almacenas en este archivo, luego en el evento Application_Start podrías recuperar el valor de estas variables.

    Creo que esta última sería la mejor opción ya que el evento Application_End no te asegura que siempre se vayan a guardar los valores correctamente, ya que podría no ejecutarse cuando se produce una finalización inesperada de la aplicación.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta crsainz jueves, 20 de agosto de 2015 10:49
    jueves, 20 de agosto de 2015 9:51
  • Perfecto! 

    Pensaba que se podría hacer algo sin usar ningún fichero, por eso lo intentaba de las formas anteriores. 

    Aprovechando que la aplicación funciona con una base de datos, he añadido una tabla para las preferencias de la aplicación y con eso arreglado y funcionando

    Muchas gracias!

    jueves, 20 de agosto de 2015 10:49