public sealed class UserLoginSingleton
{
UserLoginCollection _userLoginCol = new UserLoginCollection();
UserLoginSingleton()
{
}
public static UserLoginSingleton Instance
{
get
{
IDictionary items = HttpContext.Current.Items;
if (!items.Contains("TheInstance"))
{
items["TheInstance"] = new UserLoginSingleton();
}
return items["TheInstance"] as UserLoginSingleton;
}
}
public void CreateUserObj(string xmlData)
{
_userLoginCol = (UserLoginCollection)_xmlUtil.Deserialize(xmlData, typeof(UserLoginCollection));
}
public UserLoginCollection getUserObj()
{
return _userLoginCol;
}
}
Использование:
Страница 1.aspx
UserLoginSingleton.Instance.CreateUserObj(xml);
Pase2.aspx:
UserLoginCollection userLoginCollection = UserLoginSingleton.Instance.getUserObj();
Следил за статьей здесь: текст ссылки
Я устанавливаю свой объект коллекции на странице 1, а затем выполняю response.redirect или щелкаю ссылку, чтобы перейти на страницу 2.aspx. Однако в моем экземпляре синглтона нет установленного мной объекта коллекции. Как сохранить объект коллекции на разных страницах в каждом сеансе?
Я знаю, что static не будет работать, поскольку каждый экземпляр будет видеть объект, и я хочу, чтобы это было индивидуально для каждого пользователя.





Коллекция HttpContext.Items предоставляется по запросу. Итак, в вашем случае, когда пользователь перенаправляется на page2.aspx, экземпляр, который вы создали на странице 1, исчез. Чтобы один и тот же экземпляр был доступен для разных запросов, вам необходимо использовать HttpContext.Session для хранения вашего экземпляра.
статические поля распределяются между запросами. Остерегайтесь стандартных проблем с многопоточностью!
Экземпляры HttpContext не используются совместно между запросами.
Верно. Если он хочет, чтобы данные были общими (что он, кажется, хочет), он должен использовать статическое поле.
Он хочет, чтобы он распределялся между запросами для каждого пользователя. Статические поля определенно нет то, что он хочет. :)
Может быть, мне нужно переосмыслить то, что я хочу делать. В основном моя коллекция представляет собой набор различных значений для раскрывающегося списка. Он подается клиентом, и моя веб-страница должна отображать его.
Я решил, что клиент может отправить его мне как сериализованные данные, я дал им xsd, и они отправят его мне асинхронно при входе в систему. Страница 1 получит сериализованные данные. страница входа будет регистрировать их. как только page1 получит данные, она десериализуется в мою строго типизированную коллекцию, которая, в свою очередь, будет использоваться для создания раскрывающегося списка в page2.aspx
почему я делаю это так примитивно. мои руки связаны ограничением, и я стараюсь не использовать состояние сеанса для удержания этого объекта, если я могу этого избежать.
для каждого входа пользователя в раскрывающийся список доступны различные варианты. пользователь 1 может иметь 10 вариантов, а пользователь 2 может иметь 200 вариантов.
Если вы пытаетесь избежать сеанса для сценария веб-фермы, я бы порекомендовал либо сервер состояний ASP.NET, либо обновление таблицы в базе данных (с ключом по идентификатору входа).
Просто чтобы указать, что ваша реализация синглтона неверна, ваш синглтон должен быть объявлен следующим образом
public sealed class Singleton
{
static readonly Singleton instance=new Singleton();
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Singleton()
{
}
Singleton()
{
}
public static Singleton Instance
{
get
{
return instance;
}
}
}
Используйте статический метод, который читает HttpSession вместо статической переменной:
public class UserLoginController
{
public static UserLoginController Instance
{
get
{
HttpSession session = HttpContext.Current.Session;
if (session["UserLoginController"] == null)
{
session["UserLoginController"] = new UserLoginController();
}
return session["UserLoginController"] as UserLoginController;
}
}
}
В приведенном примере он не использует никаких статических полей.