2009-11-13 18 views
19

de HttpSessionState utilizando un "InProc" tienda parece tratar los valores clave variable de sesión como sensible a mayúsculas .NET. Por ejemplo:.NET HttpSessionState mayúsculas y minúsculas

session["foo"] = 1; 
session["Foo"] = 2; 
Trace.Write(session["foo"].ToString()); // => 2 

Este comportamiento parece ser indocumentado, por lo que me pregunto si es simplemente un efecto secundario del mecanismo de almacenamiento de sesión subyacente, o implementado intencionalmente por la propia clase. Como C# trata a todo lo demás como distingue entre mayúsculas y minúsculas, resulta un poco desconcertante para la sesión no actuar de la misma manera. ¿Lo que da? ¿Difiere por tipo de tienda? ¿Hay compatibilidad retroactiva con VB?

Respuesta

33

Las claves de HttpSessionState se hicieron insensibles a las mayúsculas y minúsculas para que coincida con el comportamiento del clásico objeto Session de ASP. Esto facilitó que los desarrolladores transfirieran sus aplicaciones ASP a ASP.NET sin introducir problemas sutiles de sensibilidad de casos.

El mismo comportamiento de clave que no distingue entre mayúsculas y minúsculas se aplica a los objetos QueryString, Cookies, etc. y otros objetos incorporados de ASP similar al clásico.

Estaba en el equipo de IIS en Microsoft cuando se estaba diseñando ASP.NET, y ASP.NET trabajó duro para mantener el código ASP.NET compatible con ASP cuando sea posible. Eso no significa que ASP.NET tuviera una compatibilidad hacia atrás perfecta, pero cada vez que surgía una decisión (como esta sensible a las mayúsculas y minúsculas), la respuesta predeterminada era hacer coincidir el comportamiento ASP clásico a menos que hubiera una buena razón para no hacerlo.

Dicho esto, acepto que la insensibilidad a mayúsculas y minúsculas de Session podría estar mejor documentada.

BTW, la colección de sesión ASP.NET obtiene su comportamiento de caso de NameObjectCollectionBase que es la clase base para todos los objetos incorporados de ASP.NET para cookies, estado de sesión, estado de aplicación, encabezados, etc. De los documentos:

La estructura subyacente de esta clase es una tabla hash.

Cada elemento es un par clave/valor.

La capacidad de un NameObjectCollectionBase es el número de elementos la NameObjectCollectionBase puede contener. Como los elementos se agregan a NameObjectCollectionBase, la capacidad se incrementa automáticamente según se requiera mediante la reasignación.

El proveedor de código hash dispensa los códigos hash para las claves en la instancia NameObjectCollectionBase. El proveedor predeterminado de código hash es CaseInsensitiveHashCodeProvider.

El comparador determina si dos llaves son iguales. El comparador predeterminado es el CaseInsensitiveComparer.

En .NET Framework versión 1.0, esta clase utiliza comparaciones de cadena sensibles a la cultura . Sin embargo, en .NET Framework versión 1.1 y posterior, esta clase utiliza CultureInfo .. ::. InvariantCulture cuando comparando cadenas. Para obtener más información acerca de cómo cultura afecta comparaciones y clasificación, consulte Comparación y ordenar datos para un específico Cultura comparar y ordenar datos para un Cultureand Específico Realización de operaciones de cadena Cultura y minúsculas.

Una pregunta de seguimiento razonable sería: ¿por qué se ASP clásico diseñado con teclas de mayúsculas y minúsculas? La razón de esto es que, en 1996 (aproximadamente), el principal lenguaje utilizado con ASP era VBScript, por lo que tenía sentido atender a las expectativas insensibles a las mayúsculas y minúsculas de los desarrolladores de VB.

+0

Gracias por la excelente respuesta (¡con fondo!). –

+0

Hola Justin, estaba tratando de ver este comportamiento en el reflector .NET, la tienda subyacente es Hashtable, parece ser un acceso directo a get/set. No pude encontrar ningún código que lo hiciera actuar de esta manera. ¿Puedes proporcionar un enlace (web) o un puntero? –

+1

Ver arriba. Agregué más información. Obtienen los Gets y Sets, pero el proveedor de código de hash utilizado no distingue entre mayúsculas y minúsculas, por lo que mayúsculas y minúsculas emiten el mismo código hash. –

0

Si bien C# distingue entre mayúsculas y minúsculas, estas construcciones en ASP.NET no distinguen entre mayúsculas y minúsculas, ya que gran parte del HTML no distingue entre mayúsculas y minúsculas (al menos en HTML4 - XHTML distingue entre mayúsculas y minúsculas). Creo que esto se implementa en la clase en sí. Es independiente de si el estado está en proceso o en otro lugar.

Cuestiones relacionadas