1

セッション内のページ全体でユーザー (およびユーザーの所属先) に関する情報を記憶する必要がある ASP.NET アプリケーションがあります。

これは、特定のサイズのほぼすべての ASP.NET アプリケーションの要件であると思います。私は何年にもわたっていくつかの異なるアプローチを使用してきました。

過去に、次のようにクエリ文字列パラメーターで id を渡しました。

site.com/page.aspx?usrid=1&companyid=2

次に、各ページで (データベースから) オブジェクトをインスタンス化します。

それを行う別の一般的な方法は、オブジェクトをセッション変数に格納することです。

Session["User"] = currentUser;              // store at login
User currentUser = (User)Session["User"];   // retrieve on some other page

DB へのアクセスを節約できますが、User オブジェクトが複雑で、サイトに多くの同時ユーザーがいる場合に使用されるメモリが心配です。

最近、次のように、マスター ページでパブリック プロパティを使用するアプリケーションを継承しました。

Master.theUser = currentUser;         // store at login
User currentUser = Master.theUser;    // retrieve on some other page

これによりキャストが保存され、読みやすくなると思いますが、パフォーマンスが良いか悪いかはわかりません。また、getter には、プライベート値が null の場合、Session 変数から取得しようとするロジックもありますが、それが使用されていないか (またはgetごとに使用されている!?) かどうかはわかりません。

私の最新のアイデアは、私のページクラスを使用することです。標準の System.Web.UI.Page 基本クラスから派生したカスタム ページ クラスがあります。パブリック プロパティとして CurrentUser などのオブジェクトが含まれます。これはうまくいくようです。私はそれがさらに好きです。

しかし、その裏で何が起こっているのか、私には本当にわかりません。どちらのアプローチが優れているか、またその理由について意見を言える人はいますか?

これを行うための別の提案も歓迎します。

更新: trace.axd と Trace.Write を使用していくつかのチェックを行ったところ、マスターページ バージョンもカスタム ページ クラス バージョンもページ間の値を「記憶」していないようです。「get」メソッドには、User プロパティが null かどうかをチェックするコード行があり、null の場合はセッション変数から読み取ります。これは、特定のページでページがプロパティ (Master.User または派生クラスの this.User) に初めてアクセスしたときに発生し、その後の要求は (セッション変数に移動することなく) 値を取得できます。

4

3 に答える 3

1

セッションはまさにこの目的のために設計されました。ユーザーの「セッション」の存続期間中、関連データを保存します。これは、20分またはユーザーがブラウザーを閉じると思います。User オブジェクトのサイズが気になる場合は、ID を保存してから DB からオブジェクトを取得できますが、DB 往復のトレードオフを検討する必要があります。ただし、ViewState のようにクライアントに送信されないため、通常は Session には関係ないと思います。Curious Geek の例のように、このセッション値をプロパティで公開することもできますが、ViewState オブジェクトの代わりに Session オブジェクトを使用します。

マスター ページでプロパティを設定しても機能しません。これは、各リクエストの最後にガベージ コレクションを取得する現在インスタンス化されているクラスのメンバーにすぎないため、次のリクエストでは使用できません。

ASP.NET での状態管理の概要を次に示します: http://msdn.microsoft.com/en-us/library/75x4ha6s.aspx

于 2010-07-06T15:50:40.843 に答える
0

したがって、これまでのところ、最善の解決策は次のようになります。

public class MyPage : System.Web.UI.Page
{


private User user;
public User User
{
    get
    {                   
        if (user == null)
        {
        user = (User)HttpContext.Current.Session["CurrentUser"];    //check if session[CurrentUser] is null here and log them out if so?
        }
        return user;
    }
    set
    {
        user = value;
        HttpContext.Current.Session["CurrentUser"] = value;
    }
}

}

次に、任意の webpage.aspx.cs で、次のようなことができます。

UsernameTextBox.Text = User.FullName;

初めて使用したときにセッションにヒットしますが、特定のページでのその後の使用はより高速になります。

User オブジェクト (および Company オブジェクトなど) を使用するたびに Session から読み取ってキャストする必要がないため、さまざまなクラスおよびコード ビハインド内のコードがよりきれいに見えます。

于 2012-02-23T04:07:34.527 に答える
0

latest私はあなたの考えに同意します。共通ページの基本クラスでタイプ your のパブリック プロパティを公開しますuser。プロパティは、セッション キーに対して読み取り/書き込みを行う必要があります。また、前のページの URL を現在のページのビューステートに格納する GoBackPage という別のプロパティもあります。

    public string GoBackPage
    {
        get
        {
            return this.ViewState["__PrevPage"].ToString();
        }

        set
        {
            this.ViewState["__PrevPage"] = value;
        }
    }

これを超えて、ビューステートに UserId のみを保存し、ビューステートから UserId を読み取り、ユーザー オブジェクトを返す共通のページベース クラスでプロパティを公開することができます。

于 2010-07-06T08:08:14.953 に答える