我们有一个 ASP.net (2.0) 应用程序配置为使用 IIS 中的网络花园选项与多个工作进程一起运行。我们的大部分数据都被缓存了,有时我们必须在站点发生更改时清除缓存。我们有一个简单的页面,它将遍历 HttpCache 项并清除它们。
但是每个工作进程都有自己的 HttpCache 对象副本,因此当我们请求缓存刷新页面时,它只会清除为该特定请求提供服务的进程的缓存。其他工作进程的缓存不会被清除。
除了以编程方式回收应用程序池之外,有没有办法清除所有工作进程的 HttpCache?
我们有一个 ASP.net (2.0) 应用程序配置为使用 IIS 中的网络花园选项与多个工作进程一起运行。我们的大部分数据都被缓存了,有时我们必须在站点发生更改时清除缓存。我们有一个简单的页面,它将遍历 HttpCache 项并清除它们。
但是每个工作进程都有自己的 HttpCache 对象副本,因此当我们请求缓存刷新页面时,它只会清除为该特定请求提供服务的进程的缓存。其他工作进程的缓存不会被清除。
除了以编程方式回收应用程序池之外,有没有办法清除所有工作进程的 HttpCache?
我认为在下面的帖子中,尼古拉斯确实解释了同样的情况。请通过它 asp.net 2.0 缓存 api 不适用于网络花园。您已经做了一些第三方缓存机制。
http://nicholas.piasecki.name/blog/2009/02/on-web-gardens-aspnet-and-iis-60/
另一个关于网络花园缓存的好讨论如下: http ://forums.asp.net/p/1077042/1588690.aspx
希望这会解决您的查询。
我使用 jquery 和一个输出页面来完成它,该页面将返回已清除进程的 PID。从 4 个工作进程中删除并且尝试不超过 10 次是硬编码的,通常它会在 4 次直接尝试中得到它。
function RemoveFromCache(buttonname, cachename) {
var allprocesses = new Array();
var trynumber = 1;
RemoveOneItem(buttonname, cachename, allprocesses, trynumber);
}
function RemoveOneItem(buttonname, cachename, allprocesses, trynumber) {
var jqxhr = $.get('/admin/cacheitems.aspx', { CacheName: cachename },
function(data) {
if (allprocesses.length == 0) {
$("#" + buttonname).attr('value', data);
allprocesses.push(data);
} else if (allprocesses.length < 4) {
var i=0;
var found = false;
for (i = 0; i < allprocesses.length; i++) {
if (allprocesses[i] == data) {
found = true;
}
}
if (found == false) {
$("#" + buttonname).attr('value', $("#" + buttonname).attr('value') + ',' + data);
allprocesses.push(data);
}
}
if (trynumber < 10) {
if (allprocesses.length < 4) {
trynumber++;
//this slows it down so it can hit a different process
$("#" + buttonname).delay(1000);
RemoveOneItem(buttonname, cachename, allprocesses, trynumber);
} else {
$("#" + buttonname).attr('value', $("#" + buttonname).attr('value') + ',REMOVED');
}
} else {
$("#" + buttonname).attr('value', $("#" + buttonname).attr('value') + ',INCOMPLETE');
}
}
);
}
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Page.IsPostBack = False Then
If Not IsNothing(Request.QueryString("CacheName")) Then
RemoveFromCache(Request.QueryString("CacheName"))
Else
Load_Data()
End If
End If
End Sub
Sub RemoveFromCache(ByVal CacheName As String)
HttpContext.Current.Cache.Remove(CacheName)
Dim encBytes As New System.Text.UTF8Encoding()
Dim bArray() As Byte = encBytes.GetBytes(CStr(System.Diagnostics.Process.GetCurrentProcess().Id))
Response.Clear()
Response.ContentType = "text/plain"
Response.AddHeader("Content-Length", SharedCode.GetField(bArray.Length))
Response.BinaryWrite(bArray)
Response.End()
End Sub
Protected Sub dgCacheItems_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles dgCacheItems.ItemDataBound
If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
Dim drv As DataRowView = CType(e.Item.DataItem, DataRowView)
Dim btn As Button = CType(e.Item.FindControl("btnRemove"), Button)
btn.Attributes("title") = "Remove " & CStr(drv("ItemName"))
'btn.CommandName = "Remove"
'btn.CommandArgument = CStr(drv("ItemName"))
btn.OnClientClick = "RemoveFromCache('" & btn.ClientID & "','" & CStr(drv("ItemName")) & "'); return false;"
End If
End Sub