2009-10-13 15 views
20

Hoy lancé una pequeña aplicación web asp.net beta que permite al personal interno modificar cierta información del producto. Empezamos a tener problemas en los que los usuarios sobrescribían la información de los demás productos ... aunque cada miembro del personal estaba editando una fila totalmente diferente (Producto).ASP.NET C# Las variables estáticas son globales?

Después de algunas búsquedas en Google, creo que sé lo que está pasando, es que ver con el uso de variables estáticas, a continuación es un ejemplo aproximado rápida del problema:

// EditProductGroup.aspx.cs 
public partial class EditProductGroup : System.Web.UI.Page 
{ 

    private static int _groupId = 0; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     _groupId = Convert.ToInt16(Request.QueryString["GroupID"]); 

    // get existing ProductGroup information from database using 
    //_groupId to find the row and populate textboxes 
    } 

    private void saveProductGroupData() 
    { 
     // when user hits 'save changes' button, update row 
     //where the primary key column 'ProductGroupID' matches _groupId in the table 
    } 
} 

Así, de acuerdo con mi investigación, una variable estática realmente existe para la aplicación como un todo, eso significa que si varios usuarios están usando la aplicación, todos estarán leyendo el mismo 'valor' para '_groupId' y en algunos casos realmente estableciéndolo en una diferente valor que causa que la "instancia" de otro usuario de la página guarde los datos en la fila incorrecta (ProductGroupId).

Mi intención era que la variable estática esté aislada de otros usuarios, y no debería interferir: cada usuario tiene su propia instancia de la página y, por lo tanto, su propia instancia de la variable '_groupId'.

Afortunadamente, todo estaba teniendo lugar en una base de datos de desarrollo/configuración, no en la base de datos en vivo. No estoy seguro de si solo necesito dejar la palabra clave "estática" para evitar que la variable sea establecida/leída por todos.

¿Alguna idea? Gracias

Respuesta

22

Sí, en ASP.NET la duración de los campos estáticos es para el dominio de la aplicación (tenga en cuenta que esto difiere un poco para los tipos genéricos).

Recomendaría utilizar la sesión del servidor para el almacenamiento de los datos que desea asociar con una instancia de una sesión del navegador del cliente (inicio de sesión del usuario). es decir

Session["_groupID"] = Convert.ToInt16(Request.QueryString["GroupID"]); 

puede recuperarla haciendo:

short groupID = Convert.ToInt16(Session["_groupID"]); 
+0

Gracias Adam ... lo único es que realmente no necesito almacenar esto para utilizarlo en otras páginas, solo quería almacenar el contenido de 'Solicitud'.QueryString ["GroupID"] 'en una variable que puedo usar en cualquier lugar dentro de esa página ... sin que sea modificada por' otras 'instancias del usuario de la página ... ¿Podría "private _groupId" (omitir la palabra clave estática) permitir ¿para esto? Si no, entonces creo que podría usar Sesiones. ¡Gracias por el aporte! – Dal

+1

Dal: las variables de sesión, como sospecha, se guardan independientemente de la página que se está viendo para la totalidad de la sesión del navegador del cliente (a menos que las expire manualmente). Puede usar ViewState para almacenar el valor, sin embargo, se transmite al cliente (con su configuración predeterminada), por lo que existe la posibilidad de que se lo pueda robar (aunque sea poco probable). ViewState mantendría el valor en una base por página. ¿Hay alguna razón por la que no pueda continuar utilizando el valor de QueryString que está utilizando inicialmente? Para su situación, recomendaría QueryString, ViewState, HiddenField o Session para el almacenamiento. –

+1

Gracias por la respuesta rápida. La aplicación se ha modificado para usar la cadena de consulta directamente en lugar de insertarla en una variable, así que sí, creo que continuaré usando este método (QueryString). Tenía curiosidad de saber si mi implementación original todavía funcionaría sin la palabra clave estática. ¡Muchas gracias! :) – Dal

2

Las variables estáticas tiene el mismo tiempo de vida como un dominio de aplicación que fueron creados en Así que si tienes unos valores erróneos que puede haber algunos problemas. en la lógica de la aplicación o de lo contrario. Debe usar SessionState para datos por usuario.

18

No es correcto decir que existe una variable estática en toda la aplicación. Ellos, de hecho, existen en dos niveles diferentes

  1. Para los tipos no genéricos hay una sola variable estática por AppDomain
  2. Para los tipos genéricos hay uno por instanciación genérico por AppDomain

una aplicación puede contiene muchos AppDomains y es verdadero en varios tipos de aplicaciones.

Sin embargo, si desea almacenar configuraciones específicas del usuario, use una variable de Sesión.

Cuestiones relacionadas