2010-07-07 14 views
6

Ich habe Formularauthentifizierung und ich brauche ein benutzerdefiniertes Objekt in HttpContext.Current.User und in Thread.CurrentPrincipal gespeichert werden.PostAuthenticateRequest wird mehrmals ausgelöst

Um dies zu erhalten, höre ich PostAuthenticateRequest Ereignis, dann lesen aus der DB, die alle Datennutzer Ich brauche in HttpContext.Current.User und in Thread.CurrentPrincipal gespeichert werden, dann instanziiert ich benutzerdefinierte IPrincipal und IIdentity Objekte und ordnen sie zu den oben genannten Standorten.

Das Problem ist, dass aus irgendeinem Grunde PostAuthenticateRequest mehrmals für eine einzige Anforderung ausgelöst .. Dies verursacht unnötige DB der wehe Leistung .. Rundreisen

Wie soll ich diese Adresse? (ASP.NET MVC 2)

Danke.

Antwort

5

Sind Sie sicher, dass es mehrmals für eine einzelne Anfrage ausgeführt wird? Denken Sie daran, dass jede Ressource wie Bilder und Stylesheets, auf die auf Ihrer Seite verwiesen wird, dieses Ereignis auslöst, da sie als separate Anfragen behandelt werden. Es empfiehlt sich, die benutzerdefinierten Objekte kurz zwischenzuspeichern und auf ihre Existenz im Cache zu prüfen und nur in die DB zu gehen, wenn sie nicht vorhanden ist.

Sie müssen einige Sperren für den Cache implementieren, da diese Anfragen normalerweise sehr nahe beieinander liegen.

+0

Oh, ja! Die Sache mit Ressourcen und etc ist mir entfallen !!! Danke für die Auffrischung! Ich habe bereits über Caching nachgedacht. Aber es geht auch mit Implikationen. Zum Beispiel lese ich aus der Datenbank und speichere die Berechtigungen des Hauptbenutzers. Sie im Cache zu haben, ist keine sehr gute Idee, falls der Admin entscheidet, die Berechtigung für einen Benutzer zu ändern - die Berechtigungen des zwischengespeicherten Benutzers werden nicht aktualisiert, bis sich der Benutzer abmeldet/anmeldet. Sie müssen Ihre Idee mit "kurz" Caching versuchen. Es sieht so aus, als sollte es die Rechnung passen .. Vielen Dank! – Ant

+0

Sie können den Cache für den aktuellen Benutzer auf Page_Init aktualisieren. Dann würde es nur einmal pro Seitenanforderung von der DB neu geladen werden. Dies tritt immer auf, bevor eine der anderen Resorcen angefordert wird, da die Seite noch nicht gerendert wurde. –

1

Verwenden Sie einfach das Tag in Ihrer web.config, um jegliche Authentifizierung von Ihren Skripten, CSS- und Bildverzeichnissen zu entfernen. Zum Beispiel:

<system.web> 
... 
</system.web> 

<location path="~/Scripts"> 
    <system.web> 
     <authorization> 
     <allow users="*"/> 
     </authorization> 
    </system.web> 
</location> 
+2

Es wird nicht helfen, dass dieses Ereignis bei jeder Anforderung ausgelöst wird, unabhängig davon, ob Sie auf die Seite zugreifen, die restriktiv ist oder nicht. – jlp

Verwandte Themen