2011-01-03 12 views
1

Ich bin dabei, eine ziemlich große Web-App zu entwickeln. Mehrere Zugriffsebenen wurden über ASP.NET-Mitgliedschafts- und Rollenanbieter definiert. Einzelne Benutzer haben auch Profile (die ich um eine Vielzahl von beliebigen Informationen erweitert habe).Object Persistence (zwischen Post-Backs) in ASP.NET

Die Frage ist, wie behalte ich den Benutzer zwischen Postbacks?

Ich könnte etwas wie HttpContext.Current verwenden, um den Benutzer zu speichern, aber seine Lebensdauer ist nur von einem Post-Back zu einem anderen. Nach meinem Verständnis müsste ich das Benutzerobjekt am Anfang des Post-Backs (OnInit/PageLoad) abrufen und es dann am Ende jedes Post-Backs wieder im HttpContext ablegen. Scheint irgendwie ineffizient.

(Ich frage mich, wenn ich dies mit einem Httpmodule tun?)

Auch, obwohl es eine statische Instanz Current in ASP.NET es ist einfach ein allgemeiner Benutzer. Ich muss das gesamte Profil (das ich in SQL erstellt habe) tragen.

Um es kurz zu wiederholen, die Frage ist: a) ist es möglich, die statische CurrentUser-Instanz von ASP.NET zu erweitern, so dass es beliebige Informationen tragen würde, während durch normale Kanäle persistent? Wenn Nein, wie kann ich solche statischen Informationen während der gesamten Dauer der Benutzersitzung beibehalten (bis sich der Benutzer entweder abmeldet oder das Session Expire/Timeout-Ereignis von global.asax ausgelöst wird)?

Jede Hilfe wird sehr geschätzt! Danke! bleepzter

+0

Ich habe vergessen zu erwähnen, dass ich Session State oder View State nicht verwenden kann. – bleepzter

Antwort

3

Verwenden Sie ein IHttpModule, die in den PostAuthenticateRequest hakt, dann speichern Sie Ihre Benutzer in der HttpContext.Current.User

Beispiel:

public class MyModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.PostAuthenticateRequest += PostAuthenticateRequest; 
    } 

    private void PostAuthenticateRequest(object sender, EventArgs e) 
    { 
     var app = (HttpApplication)sender; 
     var httpContext = app.Context; 
     IMyPrincipal principal = null; 

     principal = new MyPrincipal(httpContext.User.Identity); 

     httpContext.User = principal; 
    } 
} 
+0

Vielen Dank! Ich habe jedoch zwei Fragen. Was ist IMyPrincipal? und meinPrincipal? – bleepzter

+0

+1 Das ist ein netter Trick. Ich vergesse immer über HTTP-Module. – Greg

+0

Ok, vergiss es, ich habe nachgeschlagen - es ist das eigentliche PrincipalPermission-Objekt. – bleepzter

0

ich die Motivation gehe davon aus für diese Leistung ist? In diesem Fall lautet die Antwort normalerweise "Cache". Wenn Sie jedoch eine "ziemlich große Webanwendung" ohne SessionsState ausführen, schätze ich, dass Sie eine Webfarm planen, was bedeutet, dass Sie wahrscheinlich stattdessen memcached implementieren. Also, erstellen Sie im Grunde ein Lazy-Load-Objekt, das die Informationen aus Ihrem Cache holt und in der HttpContext.Current speichert. Die nächste Anfrage, wiederholen Sie den Vorgang.

Mein letzter Vorschlag ist es, lassen Sie es einfach aus der Datenbank bei jeder Anfrage ziehen ... es könnte gut genug, ohne durch alle diese Reifen springen.

Verwandte Themen