2011-01-03 2 views
1

상당히 큰 웹 앱을 개발하는 중입니다. ASP.NET 멤버쉽 및 역할 공급자를 통해 여러 수준의 액세스가 정의되었습니다. 개별 사용자에게는 프로필이 있습니다 (다양한 임의의 정보가 포함되도록 확장되었습니다).ASP.NET에서 오브젝트 지속성 (포스트 백간)

질문은 포스트 백간에 사용자를 어떻게 유지합니까?

사용자를 저장하기 위해 HttpContext.Current와 같은 것을 사용할 수는 있지만 그 수명은 한 포스트 백에서 다른 포스트 백까지입니다. 포스트 - 백 (OnInit/PageLoad)의 시작 부분에서 사용자 객체를 가져 와서 각 포스트 - 백의 끝 부분에있는 HttpContext로 다시 드롭해야한다는 것이 제 생각입니다. 일종의 비효율적 인 것 같습니다.

은 (내가 HttpModule을 사용하여이 작업을 수행 할 수 있을까?)

또한, 단순히 일반 사용자입니다 ASP.NET에 정적 CurrentUser 인스턴스가있다하더라도. 전체 프로필 (SQL에서 만든 프로필)을 가져와야합니다.

다시 요약하면 질문은 다음과 같습니다. a) ASP.NET에서 제공하는 정적 CurrentUser 인스턴스를 확장하여 일반 채널을 통해 지속되는 동안 임의의 정보를 전달할 수 있습니까? 아니요, 사용자 세션 기간 동안 (사용자가 로그 오프하거나 global.asax에 의해 세션 만료/시간 초과 이벤트가 발생할 때까지) 정적 정보를 어떻게 유지할 수 있습니까?

도움이 될 것입니다. 감사합니다. PostAuthenticateRequest에 후크 bleepzter

+0

언급하지 않은 것은 세션 상태 또는 뷰 상태를 사용할 수 없습니다. – bleepzter

답변

3

사용 IHttpModule은 다음 HttpContext.Current.User에 사용자를 저장

예 :이 성능 때문이다 나는 의욕을 믿고있어

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

감사합니다. 그래도 두 가지 질문이 있습니다. IMyPrincipal은 무엇입니까? MyPrincipal? – bleepzter

+0

+1 깔끔한 트릭입니다. 나는 항상 Http 모듈을 잊어 버린다. – Greg

+0

좋아, 신경 쓰지 마, 나는 그것을 보았다 - 그것은 실제 PrincipalPermission 객체이다. – bleepzter

0

? 이 경우 대답은 일반적으로 "캐시"입니다. 그러나 SessionsState없이 "꽤 큰 웹 응용 프로그램"을 실행하는 경우 웹 팜을 계획하고있는 것 같습니다. 따라서 memcached를 대신 구현할 것입니다. 따라서 기본적으로 캐시에서 정보를 가져 와서 HttpContext.Current에 저장하는 일부 지연로드 객체를 만듭니다. 다음 요청, 반복 프로세스.

내 마지막 제안은 모든 요청에 ​​대해 데이터베이스에서 가져 오도록하는 것입니다 ...이 모든 걸림새를 뛰어 넘지 않고도 충분히 수행 할 수 있습니다.