2011-01-03 14 views
1

かなり大きなWebアプリケーションを開発中です。 ASP.NETメンバシップとロールプロバイダを使用して複数のレベルのアクセスが定義されています。個々のユーザーはプロファイルも持っています(私はさまざまな任意の情報を含めるように拡張しています)。ASP.NETでのオブジェクトの永続性(ポストバック間)

質問はどのように私はバックポストの間にユーザーを維持するのですか?

私はHttpContext.Currentのようなものを使用してユーザーを格納できますが、その寿命はポストバックからポストバックまでです。ポストバック(OnInit/PageLoad)の開始時にユーザーオブジェクトを取得し、各ポストバックの最後にHttpContextにドロップする必要があると私は理解しています。一種の非効率的だと思う。

(私はHttpModuleをしてこれを行うことができますかしら?)

また、静的なCurrentUserにインスタンスがASP.NETにあるにもかかわらず、それは単に一般的なユーザーです。私はプロファイル全体(SQLで作成したもの)を運ぶ必要があります。

要点は次のとおりです。a)ASP.NETによって提供される静的なCurrentUserインスタンスを拡張して、通常のチャネルで永続化されている間に任意の情報を保持できることは可能ですか?いいえの場合、ユーザーセッションの期間中(ユーザーがログオフするか、またはセッションの期限切れ/タイムアウトイベントがglobal.asaxによって発生するまで)、どのようにこのような静的情報を保持できますか?

ご協力いただきますようお願い申し上げます。 ありがとう! bleepzter

+0

私はセッション状態、またはビューステートを使用することはできません。 – bleepzter

答えて

3

その後、HttpContext.Current.User

例でユーザーを格納し、PostAuthenticateRequestにフックのIHttpModuleを使用してください:私はこのための動機を想定してい

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

ありがとうございました!私は2つの質問がある。 IMyPrincipalとは何ですか? MyPrincipalとは? – bleepzter

+0

+1これはきちんとしたトリックです。私はいつもHttpモジュールについて忘れています。 – Greg

+0

これは、実際のP​​rincipalPermissionオブジェクトです。 – bleepzter

0

は、パフォーマンスのですか?その場合、答えは通常「キャッシュ」です。しかし、SessionsStateを使わずに「かなり大規模なWebアプリケーション」を実行しているなら、おそらくmemcachedを実装するWebファームを計画していると思います。したがって、基本的には、キャッシュから情報を取り出し、HttpContext.Currentに格納する遅延ロードオブジェクトを作成します。次の要求は、プロセスを繰り返します。

私の最終的な提案は、すべてのリクエストでデータベースから引き出すことです。これらのすべてのフープを飛び越えることなく十分に機能する可能性があります。

関連する問題