代码之家  ›  专栏  ›  技术社区  ›  madaboutcode

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

  •  4
  • madaboutcode  · 技术社区  · 15 年前

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

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

    除了以编程方式回收应用程序池之外,是否有方法清除所有工作进程的httpcache?

    2 回复  |  直到 12 年前
        1
  •  6
  •   Jalpesh Vadgama    15 年前

    我认为在下面的帖子中,尼古拉斯也解释了同样的情况。请去那里 ASP.NET 2.0缓存API不适用于Web花园。您有一些第三方缓存机制。

    http://nicholas.piasecki.name/blog/2009/02/on-web-gardens-aspnet-and-iis-60/

    关于Web花园中缓存的另一个很好的讨论是: http://forums.asp.net/p/1077042/1588690.aspx

    希望这会拖慢您的查询。

        2
  •  2
  •   user1227027    12 年前

    我使用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