2013-05-01 3 views
4

Представьте, что у меня есть экземпляр (oEmp) класса Employee, и я хотел бы сохранить его.Могу ли я модифицировать объект сеанса ASP.NET таким образом?

Session["CurrentEmp"] = oEmp; 

Если я изменить свойство в oEmp следующим образом:

oEmp.Ename = "Scott"; 

Могу ли я со ссылкой на пункт сессии через выше заявление или просто только «oEmp»?

Session["CurrentEmp"] = oEmp; //Do we still need this after any property is modified 

Это тот же случай, если я выбрал состояние сеанса SQL Server (вместо InProc).

благодаря

+0

Plase, знать об этом: http://www.hpenterprisesecurity.com/vulncat /en/vulncat/dotnet/asp_dotnet_bad_practices_non_serializable_object_stored_in_session.html. Плохая практика хранения несериализуемых объектов в переменных сеанса. – rcdmk

ответ

7

Asp.net сессия будет содержать ссылку, так что вам не нужно сделать следующее:

Session["CurrentEmp"] = oEmp; 

после изменения oEmp;

+0

Джо, ваш ответ противоречит ARS. Теперь я смущен :( – user203687

2

Я обновляю свой ответ, поскольку мое понимание сериализации данных сеанса неверно. Я не собираюсь удалять этот ответ, поскольку он может помочь другим понять, как работает сессия. Я бы поблагодарил @Guru за это.

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

См: Underpinnings of the Session State Implementation in ASP.NET для получения дополнительной информации

+0

ARS, ваш ответ противоречит Джо. Я сейчас смущен :( – user203687

+0

@ARS Можете ли вы предоставить некоторую ссылку или ресурс, объясняющие это? Я очень удивлен этим, так как поведение Сеансов не должно быть затронутое базовым местом, где оно хранится –

+0

@Guru: Я отвечаю на запрос в соответствии с моим пониманием. Однако вы можете обратиться к http://msdn.microsoft.com/en-us/library/aa479041.aspx и проверить таблицу 1. Государственные клиентские провайдеры, где упоминается о сериализации данных в случае Out-Of-Proc. Также я считаю, что после сериализации объекта, который вы не сможете изменить его состояние, если вы не обновите данные сеанса. –

2

Переменные сессии проводятся в качестве ссылочных типов, так что нет необходимости обновлять его значение каждый раз.
Объект экземпляра объекта, который вы храните, содержит только ссылку на этот объект в переменной сеанса.

Вот некоторые ссылку, чтобы помочь вам найти более подробную информацию

http://bytes.com/topic/asp-net/answers/447055-reference-types-session

http://forums.asp.net/t/350036.aspx/1

Do asp.net application variables pass by reference or value?

Смежные вопросы