Обмен данными сеанса или приложения между пользователями - наилучшая практика - PullRequest
0 голосов
/ 17 января 2012

В моем веб-приложении ASP.NET я хочу сохранить массив данных, который доступен для всех пользователей сайта, но сохраняет единственное состояние, которое может изменяться любым пользователем, вошедшим в систему. Каков наилучший подход для этого? Я понимаю, что, возможно, смогу пойти по пути использования широкой переменной Application, но есть ли лучшие альтернативы? Я также рассмотрел просто сохранение состояния в базе данных и получение для каждого запроса.

Заранее спасибо Ian

Ответы [ 2 ]

2 голосов
/ 17 января 2012

Лучший способ - через System.Web.HttpContext.Current.Cache, если состояние не должно быть постоянным.

Кэш также доступен в контексте страницы.

1 голос
/ 17 января 2012

Мой опыт использования System.Web.HttpContext.Current.Cache и кеш файла.Если в ОС недостаточно памяти, IIS очистит весь кэш.Если вы хотите сохранить состояние для всех пользователей, вы должны сохранить копию состояния в файле (серийный объект в файле).

Например: я хочу сохранить список очереди в кэше для многих пользователей, чтобы получить егоЕсли IIS сбрасывает объект Cache, он может прочитать его в файле кэша.

            Stack<string> list = null;
            List<string> returnlist = new List<string>();

            try
            {
                if (System.Web.HttpContext.Current.Cache["PushQueueList"] != null)
                {
                    try
                    {
                        list = (Stack<string>)System.Web.HttpContext.Current.Cache["PushQueueList"];
                    }
                    catch (Exception ex)
                    {
                        list = null;
                        //Log.LogToFile("PushQueueListError1:" + ex.Message);
                    }
                }
                if (list == null)//memory cache is null ,then read cache file
                {

                    try
                    {
                        list = (Stack<string>)Serialize.DeSerializeObj("pushqueue");//Deserialize object from file
                    }
                    catch (Exception ex)
                    {
                        list = null;
                        //Log.LogToFile("PushQueueListError2:" + ex.Message);
                    }
                }
                if (list == null || list.Count == 0)
                {
                    if (list!=null && list.Count == 0)
                    {
                        return new List<string>();
                    }
                    try
                    {
                        System.Web.HttpContext.Current.Cache.Remove("PushQueueList");
                    }
                    catch (Exception)
                    {
                    }
                    //Log.LogToFile("PushQueueList is empty,reload it");
                    DataSet ds = DB.GetSendQueueUserIDList(); ;
                    if (ds != null)
                    {
                        list = new Stack<string>();
                        DataView dv = ds.Tables[0].DefaultView;
                        for (int i = 0; i < dv.Count; i++)
                        {
                            list.Push(dv[i].Row["UserID"].ToString());
                        }
                        dv.Dispose();
                        ds.Dispose();
                    }
                }
            }
            catch (Exception ex)
            {
                //Log.LogToFile("PushQueueListError:" + ex.Message);
            }

            if (list != null && list.Count > 0)
            {
                for (int i = 0; i < ReturnCount; i++)
                {
                    if (list.Count > 0)
                    {
                        returnlist.Add(list.Pop());
                    }
                    else
                    {
                        Log.LogToFile("PushQueueList OK");
                        break;
                    }
                }
                System.Web.HttpContext.Current.Cache.Add("PushQueueList", list, null, DateTime.Now.AddDays(1),
                                                             TimeSpan.Zero, System.Web.Caching.CacheItemPriority.Default,
                                                             null);
                Serialize.SerializeObj(list, "pushqueue");
            }
            return returnlist;
        }

Последовательный метод приведен ниже:

    public static bool SerializeObj(object obj, string FileName)
    {
        string LogFileDir = System.Configuration.ConfigurationManager.AppSettings["LogFile"];
        if (!System.IO.Directory.Exists(LogFileDir))
        {
            System.IO.Directory.CreateDirectory(LogFileDir);
        }
        string FilePath = LogFileDir + FileName + "_" + DateTime.Now.ToString("yyyyMMdd") + ".bin";
        try
        {
            IFormatter _formatter = new BinaryFormatter();
            using(Stream _stream = new FileStream(FilePath, FileMode.Create, FileAccess.Write, FileShare.None))
            {
                _formatter.Serialize(_stream, obj);
                _stream.Close();
            }
            return true;
        }
        catch (Exception ex)
        {
            return false;
        }
    }

    public static object DeSerializeObj(string FileName)
    {
        try
        {
            string LogFileDir = System.Configuration.ConfigurationManager.AppSettings["LogFile"];
            if (!System.IO.Directory.Exists(LogFileDir))
            {
                System.IO.Directory.CreateDirectory(LogFileDir);
            }
            object objStd = null;
            string FilePath = LogFileDir + FileName + "_" + DateTime.Now.ToString("yyyyMMdd") + ".bin";

            using(Stream _stream = File.Open(FilePath, FileMode.Open))
            {
                BinaryFormatter _b = new BinaryFormatter();
                objStd = _b.Deserialize(_stream);
                _stream.Close();
            }
            return objStd;
        }
        catch (Exception ex)
        {
            return null;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...