【发布时间】:2011-01-19 02:10:11
【问题描述】:
我想重置/清除缓存中的项目,但没有重置应用程序或为此编写专门的页面。即,非编程解决方案。这可能吗?
【问题讨论】:
-
别大惊小怪,写一些代码;)
我想重置/清除缓存中的项目,但没有重置应用程序或为此编写专门的页面。即,非编程解决方案。这可能吗?
【问题讨论】:
简短回答:不。
ASP.NET 缓存没有管理界面来管理它。你需要回收你的应用程序池,或者创建一个简单的页面来做Delete Items from the Cache in ASP.NET。
编辑:受 Mick 回答的启发,您可以拥有这样的页面 (RemoveCache.aspx):
<%@ Page Language="C#" %>
<script runat="server">
void Page_Load(object sender, EventArgs e)
{
if (String.IsNullOrEmpty(Request.QueryString["name"]))
{
foreach (DictionaryEntry item in Cache)
{
Cache.Remove(item.Key.ToString());
Response.Write(item.Key.ToString() + " removed<br />");
}
}
else
{
Cache.Remove(Request.QueryString["name"]);
}
}
</script>
如果您调用RemoveCache.aspx,您的所有缓存都将被删除;运行RemoveCache.aspx?name=Products,只会删除Products缓存条目。
【讨论】:
foreach 循环中修改集合。
GetEnumerator 会生成缓存的完整副本,因此它不是行为正确的枚举器。
Dim CacheKeys As New List(Of String)
For Each CacheItem As DictionaryEntry In Cache
CacheKeys.Add(CacheItem.Key)
Next
For Each Key As String In CacheKeys
Cache.Remove(Key)
Next
这似乎会通过缓存并清除项目,但不会清除响应缓存。如果您使用 FormsAuthentication 登录网页,转到网页,注销,然后只需在地址栏中键入该 URL,它就会返回该页面。当您单击任何内容时,它会将您返回到登录页面,因为您未通过身份验证,但即使单击注销按钮时缓存已清除,该页面仍会从缓存中显示。将 Cachability 设置为 NoCache 不起作用,因为所有使用 DataBound 事件的 GridView 在使用后退按钮时都显示为过期。我仍在为这种情况寻找合适的缓存清除解决方案。
【讨论】:
手头只有 VB.NET 代码,但为什么不循环通过缓存删除项呢?
For Each de As DictionaryEntry In HttpContext.Current.Cache
HttpContext.Current.Cache.Remove(DirectCast(de.Key, String))
Next
问候
【讨论】:
For Each 循环中修改集合。