清除多个工作进程的ASP.net缓存

清除多个工作进程的ASP.net缓存,asp.net,caching,worker-process,Asp.net,Caching,Worker Process,我们有一个ASP.net(2.0)应用程序,配置为使用IIS中的web garden选项与多个工作进程一起运行。我们的大部分数据都是缓存的,当站点发生更改时,我们有时必须清除缓存。我们有一个简单的页面,它将遍历HttpCache项并清除它们 但是每个工作进程都有自己的HttpCache对象副本,因此当我们请求缓存刷新页面时,它只清除为该特定请求提供服务的进程的缓存。未清除其他工作进程的缓存 除了以编程方式回收应用程序池外,是否有其他方法可以清除所有工作进程的HttpCache 我认为尼古拉斯在下

我们有一个ASP.net(2.0)应用程序,配置为使用IIS中的web garden选项与多个工作进程一起运行。我们的大部分数据都是缓存的,当站点发生更改时,我们有时必须清除缓存。我们有一个简单的页面,它将遍历HttpCache项并清除它们

但是每个工作进程都有自己的HttpCache对象副本,因此当我们请求缓存刷新页面时,它只清除为该特定请求提供服务的进程的缓存。未清除其他工作进程的缓存


除了以编程方式回收应用程序池外,是否有其他方法可以清除所有工作进程的HttpCache

我认为尼古拉斯在下面的帖子中也解释了同样的情况。请去接它 asp.net 2.0缓存api不适用于web garden。您已经做了一些第三方缓存机制

关于web garden中缓存的另一个好讨论如下:


希望这将解决您的查询。

我使用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
函数RemoveFromCache(按钮名,cachename){
var allprocesss=new Array();
var trynumber=1;
RemoveOneItem(按钮名、缓存名、所有进程、trynumber);
}
函数RemoveOneItem(按钮名、缓存名、所有进程、trynumber){
var jqxhr=$.get('/admin/cacheitems.aspx',{CacheName:CacheName},
功能(数据){
if(allprocesss.length==0){
$(“#”+按钮名).attr('值',数据);
所有进程。推送(数据);
}else if(所有进程长度<4){
var i=0;
var=false;
对于(i=0;i