私は、ログイン時にデータベースからいくつかの情報を取得し、その人がログインしている間その情報を保持することに依存する.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);
}
マスターページの隠しフィールドを使用してこれを攻撃しようとする方が良いでしょうか?私が行ったすべての検索は、「セッションを使用しない、グローバルを使用しないでください。」と言っています。基本的に私が持っているアイデアは、これまでで最悪のアイデアを示すページがあります:)
任意の提案をいただければ幸いです。