2011-09-23 9 views
13

Il seguente codice funziona correttamente da una varietà di macchine sul nostro dominio.FindByIdentity - differenze di prestazioni

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

Tuttavia, se corro questo codice simile su una macchina che non è su un dominio, funziona ma la linea FindByIdentity prende 2+ secondi.

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

Può questa differenza di prestazioni da affrontare, fornendo parametri speciali al costruttore PrincipalContext e/o il metodo FindByIdentity? C'è un'impostazione in IIS o Windows che potrebbe essere modificata?

Per lo meno, qualcuno può dirmi perché potrebbe essere più lento nel secondo scenario?

Il codice è in esecuzione da un'app ASP.NET MVC 3 ospitata in IIS 7.5 (Pipeline integrata) su Windows Server 2008 R2.

+0

Se si ha familiarità con Network Monitor o Wireshark, è possibile acquisire i pacchetti di rete per vedere quanto tempo occorre per parlare con i controller di dominio ogni volta che viene eseguita questa query. Questo può darti un suggerimento. Questo è solo un problema di directory lato attivo, niente di sbagliato nel tuo codice. –

+0

L'unica cosa strana è che è più veloce con un controller di dominio. L'ambiente lento è solo gruppo di lavoro quindi non dovrebbe raggiungere alcun risultato. Posso provare Wireshark per vedere se trovo qualcosa di insolito. – Mayo

risposta

19

Ho avuto lo stesso problema. Prova il seguente blocco di codice. Non so perché, ma è molto più veloce (ignora il login lento per la prima volta dopo la compilazione in VS - gli accessi successivi sono veloci). Vedi simili domanda SO 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; 

La questione di fondo può avere qualcosa a che fare con NetBIOS chiama. Vedi ADLDS very slow (roundtrip to \Server*\MAILSLOT\NET\NETLOGON)

+1

Grazie. Ha funzionato per me. – ahmd0

+0

ha funzionato anche per me. Grazie! –

Problemi correlati