2012-04-17 3 views
0

Как использовать кеш в ASP.NET, который доступен для всех пользователей, а не только для определенного пользовательского контекста, при одновременном удалении определенного ключа этого кэша, когда пользователь закрывает окно браузера или истекает (например, объект сеанса)?Использование кэша ASP.NET

+0

Почему общий кеш среди всех, но отдельные ключи удалены для каждого пользователя? Почему бы просто не использовать сеанс? –

+0

Потому что я все еще хочу, чтобы другой пользователь мог получить доступ к этому объекту! –

+0

Вам нужно более подробно объяснить, что вы пытаетесь сделать. Это непонятно, и это поможет в получении вашего ответа. Можете ли вы изменить свой вопрос и предоставить более подробную информацию? – agarcian

ответ

6

Cache доступен для всех пользователей, вы можете установить его истекает после определенного периода времени:

Cache.Insert("key", myTimeSensitiveData, null, 
DateTime.Now.AddMinutes(1), TimeSpan.Zero); 

Вы можете удалить запись кэша всякий раз, когда сеанс завершается путем осуществления конечного сеанса событие в global.asax в

void Session_End(Object sender, EventArgs E) 
{ 
    Cache.Remove("MyData1"); 
} 

this Смотрите для более подробной информации о Cache

Отредактировано: Что касается вашего вопроса о том, как реагировать, когда пользователь закрывает свой браузер, я думаю, что это не просто. Вы можете попробовать javascript на стороне клиента, чтобы обрабатывать событие «разгрузить», но это не является надежным, так как браузер/клиент может просто сбой. По моему мнению, подход «сердцебиение» будет работать, но он требует дополнительных усилий. См. Это question для получения дополнительной информации.

+0

Хорошо, но как этот ключ будет удален автоматически при завершении сеанса пользователя? –

+0

Использование события окончания сеанса global.asax: void Session_End (отправитель объекта, EventArgs E) { } – Ulises

+3

+1. Обратите внимание: нет события, когда пользователь закрывает браузер, а Session_End не запускается для внепроцессного (SQL и государственной службы). –

0

Чтобы удалить элемент из кеша, вам необходимо использовать the Session_OnEnd() event. Однако это событие не срабатывает, если пользователь просто закрывает браузер. Событие будет срабатывать только при тайм-ауте сеанса. Вы, вероятно, следует добавить проверку, чтобы увидеть, если элемент уже удален:

public void Session_OnEnd() 
{ 
    // You need some identifier unique to the user's session 
    if (Cache["userID"] != null) 
     Cache.Remove("userID"); 
} 

Кроме того, если вы хотите, чтобы элемент в кэше, чтобы оставаться активным на протяжении сеанса пользователя, вы должны будете использовать скользящее истечение по элементу и обновление с каждым запросом. Я делаю это в OnActionExecuted (только для ASP.NET MVC).

protected override void OnActionExecuted(ActionExecutedContext filterContext) 
{ 
    // Put object back in cache in part to update any changes 
    // but also to update the sliding expiration 
    filterContext.HttpContext.Cache.Insert("userID", myObject, null, Cache.NoAbsoluteExpiration, 
     TimeSpan.FromMinutes(20), CacheItemPriority.Normal, null); 

    base.OnActionExecuted(filterContext); 
} 
Смежные вопросы