2011-09-23 11 views
13

El siguiente código funciona bien desde una variedad de máquinas en nuestro dominio.FindByIdentity - diferencias de rendimiento

var context = new PrincipalContext(ContextType.Domain); 
var principal = UserPrincipal.FindByIdentity(context, @"domain\username") 

Sin embargo, si ejecuta este código similar en una máquina que no está en un dominio, que funciona, pero la línea FindByIdentity toma 2+ segundos.

var context = new PrincipalContext(ContextType.Machine); 
var principal = UserPrincipal.FindByIdentity(context, @"machinename\username") 

Puede esta diferencia de rendimiento se abordarán mediante el suministro de parámetros especiales para el constructor PrincipalContext y/o el método FindByIdentity? ¿Hay alguna configuración en IIS o Windows que pueda modificarse?

Por lo menos, ¿alguien puede decirme por qué podría ser más lento en el segundo escenario?

El código se ejecuta desde una aplicación ASP.NET MVC 3 alojada en IIS 7.5 (Integrated Pipeline) en Windows Server 2008 R2.

+0

Si está familiarizado con Network Monitor o Wireshark, puede capturar paquetes de red para ver cuánto tiempo lleva hablar con los controladores de dominio cada vez que se ejecuta esta consulta. Eso puede darte una pista. Esto es solo un problema activo del lado del directorio, nada está mal en su código. –

+0

Lo único peculiar es que es más rápido con un controlador de dominio. El entorno lento solo es un grupo de trabajo, por lo que no debería estar llegando a nada. Puedo probar Wireshark para ver si veo algo inusual. – Mayo

Respuesta

19

Tuve el mismo problema. Pruebe el siguiente bloque de código. No sé por qué, pero es mucho más rápido (ignore el inicio de sesión lento por primera vez después de la compilación en VS, los inicios de sesión posteriores son rápidos). Ver similares para cuestionar Why would using PrincipalSearcher be faster than FindByIdentity()?

var context = new PrincipalContext(ContextType.Machine); 
var user = new UserPrincipal(context); 
user.SamAccountName = username; 
var searcher = new PrincipalSearcher(user); 
user = searcher.FindOne() as UserPrincipal; 

El problema subyacente puede tener algo que ver con NetBIOS llama. Ver ADLDS very slow (roundtrip to \Server*\MAILSLOT\NET\NETLOGON)

+1

Gracias. Funcionó para mí – ahmd0

+0

Funcionó para mí también. ¡Gracias! –

Cuestiones relacionadas