在asp.net中保存Cookie中的一些不同数据的好方法是什么?

时间:2010-06-06 16:53:11

标签: asp.net asp.net-mvc

我想在一个cookie文件中保留一些不同的数据并编写这个类,并想知道 - 这样做好吗?例如 - 用户JS启用。当用户在我的网站上打开他的第一页时,我写入会话他的GMT时间并用这个经理JS状态写。 (GMT时间是js的ajax请求)。我想在这个cookie中保留一些数据(最多10个值)。有任何建议或提示吗?

/// <summary>
/// CookiesSettings
/// </summary>
internal enum CookieSetting
{
    IsJsEnable = 1,
}

internal class CookieSettingValue
{
    public CookieSetting Type { get; set; }

    public string Value { get; set; }
}

/// <summary>
/// Cookies to long time of expire
/// </summary>
internal class CookieManager
{
    //User Public Settings
    private const string CookieValueName = "UPSettings";

    private string[] DelimeterValue = new string[1] { "#" };

    //cookie daat
    private List<CookieSettingValue> _data;

    public CookieManager()
    {
        _data = LoadFromCookies();
    }

    #region Save and load

    /// <summary>
    /// Load from cookie string value
    /// </summary>
    private List<CookieSettingValue> LoadFromCookies()
    {
        if (!CookieHelper.RequestCookies.Contains(CookieValueName))
            return new List<CookieSettingValue>();

        _data = new List<CookieSettingValue>();

        string data = CookieHelper.RequestCookies[CookieValueName].ToString();

        string[] dels = data.Split(DelimeterValue, StringSplitOptions.RemoveEmptyEntries);

        foreach (string delValue in dels)
        {
            int eqIndex = delValue.IndexOf("=");
            if (eqIndex == -1)
                continue;

            int cookieType = ValidationHelper.GetInteger(delValue.Substring(0, eqIndex), 0);
            if (!Enum.IsDefined(typeof(CookieSetting), cookieType))
                continue;

            CookieSettingValue value = new CookieSettingValue();
            value.Type = (CookieSetting)cookieType;
            value.Value = delValue.Substring(eqIndex + 1, delValue.Length - eqIndex-1);
            _data.Add(value);
        }

        return _data;
    }

    public void Save()
    {
        CookieHelper.SetValue(CookieValueName, ToCookie(), DateTime.UtcNow.AddMonths(6));
    }

    #endregion

    #region Get value

    public bool Bool(CookieSetting type, bool defaultValue)
    {
        CookieSettingValue inList = _data.SingleOrDefault(x => x.Type == type);
        if (inList == null)
            return defaultValue;

        return ValidationHelper.GetBoolean(inList.Value, defaultValue);
    }

    #endregion

    #region Set value

    public void SetValue(CookieSetting type, int value)
    {
        CookieSettingValue inList = _data.SingleOrDefault(x => x.Type == type);

        if (inList == null)
        {
            inList = new CookieSettingValue();
            inList.Type = type;
            inList.Value = value.ToString();

            _data.Add(inList);
        }
        else
        {
            inList.Value = value.ToString();
        }
    }

    public void SetValue(CookieSetting type, bool value)
    {
        CookieSettingValue inList = _data.SingleOrDefault(x => x.Type == type);

        if (inList == null)
        {
            inList = new CookieSettingValue();
            inList.Type = type;
            inList.Value = value.ToString();

            _data.Add(inList);
        }
        else
        {
            inList.Value = value.ToString();
        }
    }

    #endregion

    #region Private methods

    private string ToCookie()
    {
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < _data.Count; i++)
        {
            sb.Append((int)_data[i].Type);
            sb.Append("=");
            sb.Append(_data[i].Value);
            sb.Append(DelimeterValue[0]);
        }

        return sb.ToString();
    }

    /// <summary>
    /// Cookie length in bytes. Max - 4 bytes
    /// </summary>
    /// <returns></returns>
    private int GetLength()
    {
        return System.Text.Encoding.UTF8.GetByteCount(ToCookie());
    }

    #endregion
}

P.S。我想在一个cookie文件中保留许多数据来压缩数据并减少cookie数量。

2 个答案:

答案 0 :(得分:1)

不要将数据放入cookie。所有cookie数据都会在每次请求到您的网站时从客户端上传。即使具有良好宽带连接的用户通常也具有非常有限的上传带宽,因此在cookie中存储重要数据对于感知性能来说非常糟糕。

相反,只需在cookie中存储一个值,您可以在需要时将其用作查找数据库表。

答案 1 :(得分:0)

不要将数据放入cookie中。 Joel说的是看台,我想再说一遍。如果你的cookie上有大量数据,浏览器有时会表现得很奇怪,而且你会遇到一些问题,即使你不知道它们来自哪里。这是我的经验。

表现得很奇怪:他们播下空白页面,或者他们无法加载页面,你看到光标等待,或丢失cookie,或者你丢失了cookie中的数据,你可以例如,不登录,而其他人则认为是这样。