![](/img/trans.png)
[英]how to get a list of users currenltly logged in(Authenticated) to IIS6
[英]How to have permanent cached data in IIS6
我在IIS6上運行的C#(FrameWork 4.0)中有一個應用程序。
我想永久地緩存數據數據(步行類),但是事件或類似的東西會在短時間內(15-25分鍾)刪除此緩存數據。
我僅使用以下選項配置IIS:回收工作進程(以分鍾為單位)1740。
有什么想法可以保留緩存的數據嗎? 靜態變量的文件時間是否與應用程序生存期相同?
public class CacheUsers
{
static object objlock;
private static List<Users> usersList { get; set; }
private static DateTime lastUpdate;
public CacheUsers()
{
if (objlock == null)
{
objlock = new object();
}
lock (objlock)
{
if (usersList == null || usersList.Count.Equals(0) || (lastUpdate < DateTime.Now.AddHours(-24)))
{
UpdateUserList();
}
}
}
public static List<Users> ListaCacheada
{
get
{
if (usersList == null || usersList.Count.Equals(0) || (lastUpdate < DateTime.Now.AddHours(-24)))
{
UpdateUserList();
}
return usersList;
}
}
/// <summary>
/// Refresh the user list
/// </summary>
private static void UpdateUserList()
{
usersList = GetUsers();
lastUpdate = DateTime.Now;
}
}
編輯:對象可以生存多長時間-
從技術上講 ,AppDomain中的CLR對象無法幸免於該AppDomain的重啟(即,在ASP.Net中,它可能是由web.config的更改引起的),因此,無法幸免於AppPool回收(進程關閉)。 原生對象也將無法在AppPool回收中生存。
無需回收AppPool將再次創建流程(實際上不會),只有對此AppPool服務的站點的第一個請求才會啟動流程。
因此,如果您的目標嚴格是“我的CLR對象必須在AppPool回收后必須立即放入某種緩存中”,則最接近的方法是在Application_Start(或模塊中的等效方法)中重新緩存對象。 請注意,不能保證在程序集加載時會創建靜態對象,因此,如果要使用靜態對象進行緩存,則仍然需要觸發創建,即通過在Application_Start中訪問它們。
如果您需要對象在AppPool的生命周期內無法生存,則需要單獨的服務。 此類系統必須將對象保留在流程(有時甚至是機器)之外,因此您將付出遠程訪問此類對象的費用。
您可能對分布式緩存(例如memcachd )感興趣,以了解它是否適合您的需求。
正常的“緩存”用法是緩存創建成本很高的對象,目前尚不清楚要使用“緩存”定義來實現。
這通常是通過在提供對象的方法中隱藏緩存邏輯來完成的:
MyObject GetMyObject()
{
MyObject result= cacheProvider.Get("cacheId_MyObject");
if (result = null)
{
result = VerySlowMethodToCreateMyObject();
cacheProvider.Cache("cacheId_MyObject", result);
}
return result;
}
考慮簡單地使用System.Web.Caching.Cache。 它的Insert方法提供了很多選項。 如果提供onRemoveCallback,甚至可以實現“永久緩存”項。
我已經修改了代碼,並且使用HttpRuntime.Cache,但沒有任何反應。 :-(
問題在於,應用程序池每天只能運行一次,因為:
我僅使用以下選項配置IIS:回收工作進程(以分鍾為單位)1740
並且似乎有很多次啟動此過程(大約每15分鍾啟動一次)。
我只想停止App Pool回收站。 誰可以做?
public class CacheUsers
{
static object objlock;
private static List<Users> usersList { get; set; }
public CacheUsers()
{
if (objlock == null)
{
objlock = new object();
}
lock (objlock)
{
if (usersList == null || usersList.Count.Equals(0))
{
UpdateUserList();
}
}
}
private static void UpdateUserList()
{
usersList = GetList();
HttpRuntime.Cache.Insert("Key", usersList , null,
Cache.NoAbsoluteExpiration,
Cache.NoSlidingExpiration,
System.Web.Caching.CacheItemPriority.NotRemovable,
ReportRemovedCallback
);
}
}
ReportRemovedCallback指示此原因:已刪除。 但是,是誰呢?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.