2013-04-22 1 views
1

Я работаю над aspx-приложением (C#), где я использую HttpSessionState для сохранения различных объектов в коде, расположенных между изменениями вида. Некоторые из этих объектов содержат общие списки (List<T>), но эти списки, похоже, не сохраняются, когда я использую базу данных SQL для хранения состояния (sessionState mode = "SQLServer"). Все остальные свойства объекта сохраняются, но когда я пытаюсь получить список, я получаю пустые списки.Общие списки в HttpSessionState, хранящиеся в SQL

Самое забавное, что все работает нормально, если я использую sessionState mode = "InProc".

Мои классы имеют атрибут Serializable. Я запускаю C# /. NET 4.0.

Любые идеи были бы оценены!

EDIT:

Просто уточнить с каким-то кодом (не дословным!).

У меня есть классы, я хочу, чтобы сохранить (экземпляры) в моем государстве Session:

public class MyClass 
{ 
    public string Property1 { get; set; } 
    public string Property2 { get; set; } 
    public List<MyOtherClass> Property3 { get; set; } 
} 

public class MyOtherClass 
{ 
    public string AnotherProperty1 { get; set; } 
    public string AnotherProperty2 { get; set; } 
} 

Тогда, в моем коде позади - одно действие сохраняет объекты предыдущих классов:

public void MyMethod() 
    { 
     MyClass myClass = new MyClass() 
     { 
      Property1 = "One string", 
      Property2 = "One other string", 
      Property3 = new List<MyOtherClass>() { new MyOtherClass() { AnotherProperty1 = "One", AnotherProperty2 = "Ohter" } } 
     }; 

     HttpContext.Current.Session["MyKey"] = myClass; 
    } 

... и другое действие восстановит этот объект:

public void MyOtherMethod() 
    { 
     MyClass myClass = (MyClass)HttpContext.Current.Session["MyKey"]; 

     int c = myClass.Property3.Count; // Will be 0!! 
    } 

myClass.Property1 Так и myClass.Property2 будет удерживать строки, установленные мной ранее, но myClass.Property3 - пустой список.

+0

Вы настроили приложение для использования SQL-сервера для состояния сеанса? см. этот пост на ho wto сделать это http://stackoverflow.com/questions/7394357/asp-net-4-0-storing-session-in-sqlserver –

+0

Да. Это приложение размещено на веб-сервере с несколькими сайтами, и в основном все остальные сайты на сервере используют SQL для состояния сеанса. Также - помните, что в моем приложении он хранит все данные в объектах, кроме списков (которые инициализированы, но пусты)! – Superhubert

+0

Можете ли вы показать свой код, где вы храните и читаете объект списка? –

ответ

1

Проблемы вы описываете может произойти, если вы

  • магазин ссылка на объект в этом общем списке, который является действительным, если вы храните его, но
  • ссылка больше не действительна при последующих запросах ,

Примером может служить ссылка на элемент управления из коллекции Page.Controls - эта ссылка недействительна, если вы попытаетесь восстановить ее на другой обратной стороне. Фактически, ссылка может быть просто очищена сборкой мусора (поэтому ваш список кажется пустым).

Без вашего фактического кода трудно сказать наверняка (хотя ваш примерный код отлично справляется с тем, что вы имеете в виду). Но это кажется мне вероятным.

+0

Я в основном заканчиваю рефакторизацию кода, чтобы избежать всей этой проблемы, но я думаю, что вы правы в отношении ссылок. Настоящий код здесь трудно представить, так как он «разбросан» по многим методам и классам.Но когда я больше искал код, я видел некоторые места, где потенциально могу возникнуть проблема со ссылками, которые вы описываете. – Superhubert

+0

@ Суперхуберт Отлично! Да, вы подходите (рефакторинг), вероятно, лучший подход =) Я рад, что смог бы дать некоторое представление. – jadarnel27