Я хотел бы хранить некоторые объекты только для одного запроса через состояние сеанса. Я, может казаться, не думаю о простом способе выполнить это. Это точно, какой MVC's ASP.NET объект TempData делает. Кто-либо мог предоставить мне ссылку или некоторые примеры того, как иметь объект в состоянии сеанса, только переживают один дополнительный запрос?
Я думал, это могло быть возможно выполнено путем создания пользовательского объекта словаря, который хранит возраст (# запросов) на каждом объекте. Путем подписки на Application_BeginRequest и методы Application_EndRequest, Вы могли выполнить необходимую очистку объектов. Это могло даже, вероятно, упростить создание объекта, который сохранил часть данных для X запросов, не всего один. Это на правильном пути?
Я реализовал нечто очень похожее на то, что вы описали, в методе Application_AcquireRequestState в Global.ascx.cs. Все мои объекты сессии обернуты в класс, который ведет подсчет количества прочтений.
// clear any session vars that haven't been read in x requests
List<string> keysToRemove = new List<string>();
for (int i = 0; HttpContext.Current.Session != null && i < HttpContext.Current.Session.Count; i++)
{
var sessionObject = HttpContext.Current.Session[i] as SessionHelper.SessionObject2;
string countKey = "ReadsFor_" + HttpContext.Current.Session.Keys[i];
if (sessionObject != null/* && sessionObject.IsFlashSession*/)
{
if (HttpContext.Current.Session[countKey] != null)
{
if ((int)HttpContext.Current.Session[countKey] == sessionObject.Reads)
{
keysToRemove.Add(HttpContext.Current.Session.Keys[i]);
continue;
}
}
HttpContext.Current.Session[countKey] = sessionObject.Reads;
}
else if (HttpContext.Current.Session[countKey] != null)
{
HttpContext.Current.Session.Remove(countKey);
}
}
foreach (var sessionKey in keysToRemove)
{
string countKey = "ReadsFor_" + sessionKey;
HttpContext.Current.Session.Remove(sessionKey);
HttpContext.Current.Session.Remove(countKey);
}
Здесь можно найти нечто очень похожее: http://maff.ailoo.net/2009/06/build-a-flashmessenger-system-in-aspnet-mvc/