我正在开发一个 .net 项目,该项目依赖于在登录时从数据库中提取一些信息并在用户登录时保留这些信息。
该网站很复杂,但我觉得可能会出现过度使用 Session 变量的情况。我现在要说我正在使用 session 来存储大约 5 个 int 值和 3 或 4 个字符串值。我没有存储任何复杂的对象。我网站的每个页面都多次使用这些值,我觉得每次都发布它们是荒谬的。在这一点上,我也不认为 viewstate 比 session 更好,但我愿意接受建议。
会话变量的当前用法示例
this.Session["vendorCategoryId"]
this.Session["ftp_directory_name"]
this.Session["VendorCodeOptionRefId"]
我考虑过在一个类中实现一个结构并在那里有一个我在 Global.asax.cs 中使用的 set 方法Session_Start()
可能是一种解决方案......
(编辑:此解决方案旨在避免每次任何代码想要访问变量时都必须敲击数据库)。
在 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);
}
尝试使用母版页上的隐藏字段来攻击它会更好吗?我所做的每一次搜索都说“不要使用会话,不要使用全局变量..”基本上我有任何想法,有一些页面说明它是有史以来最糟糕的想法:)
任何建议,将不胜感激。