0

我正在开发一个 .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);
                 }

尝试使用母版页上的隐藏字段来攻击它会更好吗?我所做的每一次搜索都说“不要使用会话,不要使用全局变量..”基本上我有任何想法,有一些页面说明它是有史以来最糟糕的想法:)

任何建议,将不胜感激。

4

2 回答 2

2

数据量并不特别令人惊讶,但选择却是。

通常会话会存储用户信息(通常只是他们的 ID - 您从数据库中获取其余信息)。“ftp_directory_name”听起来像一个配置变量或每个用户的设置。

我很惊讶您没有使用唯一 ID 将 VendorData 存储在数据库中,然后只获取详细信息(您需要将供应商 ID 存储在会话中 - 如果这与用户不同)。

该解决方案旨在避免每次任何代码想要访问变量时都必须敲击数据库

这似乎是一个不存在的问题的解决方案 - 您是否看到访问时间问题并且您确定这是正确的解决方案?无论如何,您将不得不为大多数页面访问数据库。每个页面加载一个额外的查询不太可能成为问题。

于 2013-02-25T21:42:25.133 回答
1

我会说你可能已经做对了...... Session 旨在为用户的“会话”存储信息......我认为你不会像存储整个 DataSet 那样对它征税太多或其他什么...一些 int 变量和一个字符串占用不到 1K 的内存...如果您有 1,000 个用户同时登录,他们的集体“会话”占用空间仍然约为 1MB...piton on今天的服务器。

于 2013-02-25T21:48:15.920 回答