Uno de los miembros de mi equipo se ha encontrado recientemente con un problema técnico interesante en la matriz. Si alguien puede ayudar a explicar esto, sería genial. Es posiblemente complicado de explicar, así que tengan paciencia conmigo.Extraño problema de GUID de 64/32 bits bajo IIS7
Estamos construyendo una aplicación ASP.Net. En él tenemos una declaración simple "si".
Guid adminId = Guid.Empty;
if (mRoles.Contains("Admin"))
{
adminId = mUserId;
}
(donde mRoles es una lista y contiene “admin”)
Esto funciona como se espera (es decir adminid se le asigna el mUserId). Sin embargo, cuando se reescribe para usar un operador ternario debajo ¡no es así! (¡adminID tiene asignada la Guid Empty)!
Guid adminId = mRoles.Contains("Admin") ? mUserId : Guid.Empty;
El desarrollador que descubrió esto es en una máquina de 64 bits (IIS 7 Vista/64 bits) y si cambia la configuración de IIS de la siguiente manera ... En "grupo de aplicaciones predeterminado"> "Avanzado Configuración "check" Habilita aplicaciones de 32 bits ". ¡Ahora ambas declaraciones funcionan!
Creemos que esto es algo que hacer posiblemente con el hecho de que un Guid es una estructura en lugar de una clase y que el valor de alguna manera se compensa con un proceso de 64 bits.
Sospecho que el problema es similar a esto ... http://www.mail-archive.com/[email protected]/msg00164.html Lo que puede explicar por qué funciona la primera instrucción if simple. (como la creación de la variable adminId es tal vez la creación de un puntero y el operador ternario no es?)
Si alguien pudiera arrojar alguna luz sobre esto, sería genial. ¿Es un error de compatibilidad? ¿o nuestra incomprensión de la combinación de operadores y estructuras ternarios?
Gracias.
ACTUALIZACIÓN
armar una aplicación sencilla y no pueden reproducirse en un proyecto completamente nuevo, así que debe haber algo más que los GUID.
// Obras (mUserId asigna a adminid)
Guid adminId = true ? mUserId : Guid.Empty;
// No funciona (aunque t == true !!!! ???)
bool t = (mRoles.Contains("TenantAdmin");
Guid adminId = t ? mUserId : Guid.Empty;
Creo que estamos Volveré al tablero de dibujo en esto. Gracias a todos por su ayuda y, si conseguimos más, volveré a publicar aquí.
Lo único que tal vez no era demasiado claro es que mRoles no es una cadena genérica de tipo de cadena. Es una cadena [] y el método Contiene() es el método de extensión de LINQ si hace alguna diferencia, pero no puede ver por qué: -?
ACTUALIZACIÓN 2
Hemos visto la IL y es correcto (y ahora funciona de manera intermitente!) Lo que hemos encontrado es que cuando el incumplimiento de la aplicación de la piscina cargas más aplicaciones que empieza a fallar de nuevo . La única otra cosa que podemos pensar es que algunas de estas otras aplicaciones pueden contener algún código no administrado que de alguna manera interfiere con nuestra aplicación, ¿podría ser posible?
¿Puede reproducir el comportamiento en unas pocas líneas simples en un proyecto completamente nuevo? –
+1. Muy distrubing – AnthonyWJones
Compara el IL que se produce cuando las diferentes configuraciones están en vigor durante la compilación. – AakashM