Очистить кэш ASP.net для нескольких рабочих процессов - PullRequest
4 голосов
/ 20 мая 2009

У нас есть приложение ASP.net (2.0), настроенное для работы с несколькими рабочими процессами с использованием параметра веб-сада в IIS. Большая часть наших данных кэшируется, и иногда нам приходится очищать кеш при появлении изменений на сайте. У нас есть простая страница, которая будет перебирать элементы HttpCache и очищать их.

Но каждый рабочий процесс имеет свою собственную копию объекта HttpCache, поэтому, когда мы запрашиваем страницу обновления кэша, он очищает кэш только для процесса, который обслуживает этот конкретный запрос. Кэш для других рабочих процессов не очищается.

Есть ли способ очистить HttpCache для всех рабочих процессов, кроме программной переработки пула приложений?

Ответы [ 2 ]

6 голосов
/ 20 мая 2009

Я думаю, что в следующем посте Николай действительно объяснил тот же сценарий. Пожалуйста, пройдите через это API кеша asp.net 2.0 не будет работать для веб-сада. У вас есть какой-то сторонний механизм кэширования.

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

Еще одно хорошее обсуждение кеширования в веб-саду: http://forums.asp.net/p/1077042/1588690.aspx

Надеюсь, это отнимет ваш запрос.

2 голосов
/ 23 февраля 2012

Я сделал это, используя 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
...