2009-05-20 15 views
4

IISでWeb Gardenオプションを使用して複数のワーカープロセスで実行するASP.net(2.0)アプリケーションが構成されています。私たちのデータの大部分はキャッシュされており、時にはサイトに変更があったときにキャッシュをクリアする必要があります。 HttpCache項目を繰り返し処理してクリアする簡単なページがあります。複数のワーカープロセスのASP.netキャッシュを消去します

しかし、各ワーカープロセスには独自のHttpCacheオブジェクトのコピーがあります。したがって、キャッシュ更新ページを要求するときには、その特定の要求を処理するプロセスのキャッシュのみをクリアします。他のワーカープロセスのキャッシュはクリアされません。

プログラムプールをリサイクルする以外のすべてのワーカープロセスでHttpCacheをクリアする方法はありますか?

答えて

5

ニコラスが同じシナリオを説明した次の記事では、それを通過してください asp.net 2.0キャッシュapiはウェブガーデンのために動作しません。あなたはサードパーティのキャッシュメカニズムをいくつか持っています。これはあなたのクエリをsloveます http://forums.asp.net/p/1077042/1588690.aspx

希望:

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

ウェブ庭のキャッシュについてのもう一つの良い議論は次のとおりです。

2

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 
関連する問題