0

私は、ログイン時にデータベースからいくつかの情報を取得し、その人がログインしている間その情報を保持することに依存する.netプロジェクトに取り組んでいます。

サイトは複雑ですが、Session変数の使いすぎが発生しているのではないかと思います。ここで、セッションを使用して約5つのint値と3つまたは4つの文字列値を格納していると言います。複雑なオブジェクトは保存されていません。私のサイトのすべてのページはこれらの値を複数回利用しており、毎回投稿するのはばかげていると思います。現時点では、ビューステートがセッションよりも優れているとは思いませんが、提案を受け付けています。

セッション変数の現在の使用例

this.Session["vendorCategoryId"]
this.Session["ftp_directory_name"]
this.Session["VendorCodeOptionRefId"]

Session_Start()クラスに構造体を実装し、イベントでGlobal.asax.csから使用するsetメソッドをそこに置くことは1つの解決策かもしれないと考えました...

(編集:このソリューションは、コードの一部が変数にアクセスするたびにデータベースをハンマーで叩く必要がないように設計されています)。

VendorSessionData.csクラス内

    public struct VendorData
    {
        public int VendorCategoryId;

        public int NKIAccountingCode;

        public int OptionCodeRefId;

        public string FtpDirName;
    }


    /// <summary>
    ///   The set vendor session data.
    /// </summary>
    public class VendorSessionData
    {
        #region Public Methods

        public static VendorData GetVendorData(Guid vendorGuid)
        {
            VendorData retVal = new VendorData();

            using (NKIDBDataContext db = new NKIDBDataContext())
            {

                vendorInfo vendorRefs = (from vendorInfo in db.vendorInfos where vendorInfo.guid == vendorGuid.ToString() select vendorInfo).SingleOrDefault();
                if (vendorRefs != null)
                {
                    retVal.VendorCategoryId = vendorRefs.category_id;
                    retVal.NKIAccountingCode = vendorRefs.nki_vendor_id;
                    retVal.OptionCodeRefId = vendorRefs.option_ref_id;
                    retVal.FtpDirName = vendorRefs.ftp_directory_name;
                }

            }

            return retVal;
        } ......

そしてglobal.asax.csで

 public class Global : HttpApplication
        {

            public static VendorData CurrentVendorData;

            public void Session_Start(object sender, EventArgs e)
            {
/////////////////FYI tmpVendorGuid is set in code above this point
                 Guid tmpVendorGuid;
                 if (Guid.TryParse(vendorGuid, out tmpVendorGuid))
                 {
                     CurrentVendorData = VendorSessionData.GetVendorData(tmpVendorGuid);
                 }

マスターページの隠しフィールドを使用してこれを攻撃しようとする方が良いでしょうか?私が行ったすべての検索は、「セッションを使用しない、グローバルを使用しないでください。」と言っています。基本的に私が持っているアイデアは、これまでで最悪のアイデアを示すページがあります:)

任意の提案をいただければ幸いです。

4

2 に答える 2

2

データの量は特に驚くべきことではありませんが、選択は驚くべきことです。

通常、セッションにはユーザー情報が格納されます(通常はユーザーIDのみです。残りはDBから取得します)。「ftp_directory_name」は、構成変数またはユーザーごとの設定のように聞こえます。

一意のIDを使用してVendorDataをデータベースに保存せず、詳細を取得するだけで驚いています(Vendor IDをセッションに保存する必要があります-それがユーザーと同じでない場合)。

このソリューションは、コードの一部が変数にアクセスするたびにデータベースをハンマーで叩く必要がないように設計されています

これは、存在しない問題の解決策のようです。アクセス時間に問題があり、これが正しい解決策であると確信していますか?とにかく、ほとんどのページでDBをヒットする必要があります。ページの読み込みごとに1つの余分なクエリが問題になる可能性はほとんどありません。

于 2013-02-25T21:42:25.133 に答える
1

あなたはおそらくすでにそれを正しくやっていると思います...セッションはユーザーの「セッション」の情報を保存するために設計されました...データセット全体を保存しているかのようにあまり負担をかけているとは思いませんまたは何か...いくつかのint変数と文字列は1K未満のメモリを占有します...同時に1,000人のユーザーがログインしている場合、それらの集合的な「セッション」フットプリントは依然として約1MBになります...ピトン今日のサーバー。

于 2013-02-25T21:48:15.920 に答える