Używamy proste podejście usług internetowych. Nasz mechanizm czyszczenia pamięci podręcznej sprawdza ustawienie konfiguracji internetowej, aby sprawdzić, czy istnieją inne serwery i asynchronicznie wywołuje usługę WWW na tych serwerach.
Przechowujemy dane z określonymi konotacjami nazewnictwa, aby ułatwić wyczyszczenie tego, co chcemy. Tak więc przekazujemy prefiks lub przyrostek dla elementu, który ma zostać usunięty, ponieważ czasami może być on specyficzny dla użytkownika (np. Identyfikator użytkownika jest dołączany do nazwy elementu) lub specyficzny dla aplikacji (np. Przedrostek elementu to aplikacja Nazwa).
Oto przykład VB od rutyny ClearItem że będzie wzywał ani jednego ze swoich węzłów:
Public Shared Sub ClearItem(ByVal strPrefix As String, ByVal strPostfix As String)
If WebConfig.Caching_Enabled() Then
' Exit if no criteria specified '
If IsNothing(strPrefix) AndAlso IsNothing(strPostfix) Then
Exit Sub
End If
' At the very least we need a Postfix '
If Not IsNothing(strPostfix) AndAlso Not strPostfix.Length.Equals(0) Then
_ClearItem(strPrefix, strPostfix)
End If
If WebConfig.Caching_WebFarmEnabled() Then
' Now clear the cache across the rest of the server farm '
_ClearItem_WebFarm(strPrefix, strPostfix)
End If
End If
End Sub
Private Shared Sub _ClearItem_WebFarm(ByVal strPrefix As String, ByVal strPostfix As String)
If WebConfig.Caching_WebFarmEnabled() Then
' Use a web service on each server in the farm to clear the '
' requested item from the Cache '
' Determine which servers need to remove cache items '
Dim arrServers As String()
arrServers = Split(WebConfig.Caching_WebFarmServers(), "|")
Dim strServer As String ' Holds which server we are currently contacting '
' Loop through all the servers and call their web services '
For Each strServer In arrServers
Dim WS As New WebServiceAsyncCall
WS.StartCallBack(strServer, strPrefix, strPostfix)
Next
End If
End Sub
Private Shared Sub _ClearItem(ByVal strPrefix As String, ByVal strPostfix As String)
If WebConfig.Caching_Enabled() Then
' Determine how we are comparing keys '
Dim blnPrefix, blnPostfix As Boolean
If strPrefix.Length.Equals(0) Then
blnPrefix = False
Else
blnPrefix = True
End If
If strPostfix.Length.Equals(0) Then
blnPostfix = False
Else
blnPostfix = True
End If
' Reference the Cache collection '
Dim objCache As System.Web.Caching.Cache = HttpContext.Current.Cache
' Exit if the cache is empty '
If objCache.Count.Equals(0) Then
Exit Sub
End If
' Clear out the cache for all items matching the input(s) (on this local server) '
Dim objCacheEnum As IEnumerator = objCache.GetEnumerator()
Dim objCacheItem As Object
Dim objCurrentKey As System.Collections.DictionaryEntry
Dim strCurrentKey As String
' Enumerate through the cache '
While objCacheEnum.MoveNext()
objCurrentKey = CType(objCacheEnum.Current, DictionaryEntry)
strCurrentKey = objCurrentKey.Key.ToString()
' How are we comparing the key? '
If blnPrefix AndAlso Not (blnPostfix) Then ' Only by PREFIX '
If strCurrentKey.StartsWith(strPrefix) Then
' Remove it from the cache '
objCacheItem = objCache.Remove(strCurrentKey) ' Returns a reference to the item '
objCacheItem = Nothing ' Need to explicitly nuke this because the objCache.Remove() above doesn t destroy '
End If
ElseIf Not (blnPrefix) AndAlso blnPostfix Then ' Only by POSTFIX '
If strCurrentKey.EndsWith(strPostfix) Then
' Remove it from the cache '
objCacheItem = objCache.Remove(strCurrentKey) ' Returns a reference to the item '
objCacheItem = Nothing ' Need to explicitly nuke this because the objCache.Remove() above doesn t destroy '
End If
ElseIf blnPrefix AndAlso blnPostfix Then ' By both PREFIX and POSTFIX'
If strCurrentKey.StartsWith(strPrefix) AndAlso strCurrentKey.EndsWith(strPostfix) Then
' Remove it from the cache '
objCacheItem = objCache.Remove(strCurrentKey) ' Returns a reference to the item '
objCacheItem = Nothing ' Need to explicitly nuke this because the objCache.Remove() above doesn t destroy '
End If
Else
' Not comparing prefix OR postfix? Why bother continuing then! '
Exit Sub
End If
End While
End If
End Sub
widać, że powyższy kod wywołuje inny serwer (y) za pomocą tej klasy pomocnika:
Private Class WebServiceAsyncCall
Public Sub StartCallBack(ByVal strService As String, ByVal strPrefix As String, ByVal strPostfix As String)
ActiveWebServiceCounter += 1
Dim clearCacheProxy As New CacheClearService.CacheClear ' This is the web service which of course will exist on the other node as well '
clearCacheProxy.Url = strService
AddHandler clearCacheProxy.ClearItemCompleted, AddressOf DoneCallBack
clearCacheProxy.ClearItemAsync(strPrefix, strPostfix)
End Sub
Public Sub DoneCallBack(ByVal sender As Object, ByVal e As CacheClearService.ClearItemCompletedEventArgs)
ActiveWebServiceCounter -= 1
If e.Result.Length > 0 Then ' Something failed '
' Log the error '
End If
End Sub
End Class
Usługa internetowa na serwerze zdalnym wywołuje ten sam kod, który wywołał _ClearItem.
Cieszę się, że moje rozwiązanie będzie dla Ciebie skuteczne. Jeśli napotkasz jakieś przeszkody daj mi znać! – wweicker