2009-05-20 15 views
4

Nous avons une application ASP.net (2.0) configurée pour s'exécuter avec plusieurs processus de travail en utilisant l'option web garden dans IIS. La plupart de nos données sont mises en cache et, à l'occasion, nous devons effacer le cache lorsque des modifications sont apportées au site. Nous avons une page simple qui parcourra les éléments HttpCache et les effacera. Mais chaque processus de travail a sa propre copie de l'objet HttpCache et lorsque nous demandons la page d'actualisation du cache, il efface uniquement le cache du processus qui traite cette requête particulière. Le cache pour les autres processus de travail n'est pas effacé.Effacer le cache ASP.net pour plusieurs processus de travail

Existe-t-il un moyen d'effacer HttpCache pour tous les processus de travail autres que le recyclage par programme du pool d'applications?

Répondre

2

Je l'ai fait en utilisant jquery et une page de sortie qui retournerait le PID du processus qui a été effacé. Il est codé en dur pour supprimer de 4 processus de travail et ne pas essayer plus de 10 fois, habituellement il l'obtient dans 4 essais droits.

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 
Questions connexes