A példában azt fogjuk figyelni, hogy egy IP címről érkezik-e tíz kérés egy perc időtartam alatt.
Ezt úgy valósítjuk meg, hogy minden, az alkalmazásunkhoz érkező kérés esetén eltároljuk az ügyfél IP címét a Cache-ben egy perc időtartamra, vagyis egy perc után az adott bejegyzést a Cache automatikusan törli. Ezek után most már csak meg kell számlálnunk egy kérés kiszolgálása előtt, hogy az adott IP cím szerepel-e már a Cache-ben tíznél többször vagy sem. Ha igen, akkor biztosak lehetünk benne, hogy egy perc alatt ugyanattól az ügyféltől már tíz kérés érkezett, így annak kiszolgálását elutasíthatjuk.
A Page Load eseményénél helyezzük az IP címet a Cache-re és itt ellenőrizzük azt is, hogy kérés kiszolgálható-e vagy sem.
Itt első lépésként meghatározzuk a kliens IP címét.
string ip = Request.UserHostAddress;
Ezt követően kell egy olyan nevet generálnunk, amilyen névvel még nincs objektum elhelyezve a Cache-ben. Ehhez egy konstans szöveget és egy véletlenszerű számot választunk, majd ellenőrizzük, hogy e névvel létezik-e már objektum a Cache-ben. Ha igen, akkor egy újabb nevet generálunk.
Random r = new Random();
do
{
s = "OverLoadIPAddress_" + r.Next(int.MaxValue);
}
while (Cache.Get(s) != null);
Ha már adott a név, akkor elhelyezhetjük az IP címet a Cache-ben. Ehhez a Cache Add függvényét hívjuk meg. Ebben megadjuk, hogy az aktuális időponthoz képest hatvan másodpercig maradjon meg ez az adat a Cache-en.
Cache.Add(s, ip, null, DateTime.Now.AddSeconds(60), Cache.NoSlidingExpiration, CacheItemPriority.High, null);
Végül már csak annyi a teendőnk, hogy ellenőrizzük, hogy az adott IP cím kiszolgálása megtörténhet-e, vagy már nem. Ehhez a belső Access nevű függvényünket hívjuk, melynek paraméterként átadjuk a vizsgálandó IP címet. Visszatérési értékként egy logikai értéket kapunk, mely ha igaz, akkor a kérést kiszolgálhatjuk.
if (Access(ip))
{
Label3.ForeColor = Color.Green;
Label3.Text = "Hozzáférés engedélyezett!";
}
else
{
Label3.ForeColor = Color.Red;
Label3.Text = "A hozzáférés tiltott a túl sok kérés miatt!";
}
}
Nézzük miként is működik az Access függvény.
private bool Access(string ip)
{
string s;
int count = 0;
Az adott IP cím számlálásához végig kell mennünk a Cache összes bejegyzésén és ellenőrizni, hogy az adott IP hányszor szerepel. Ehhez kérünk a Cache-től egy IDictionaryEnumerator interfészt a GetEnumerator függvényének hívásával.
IDictionaryEnumerator de = Cache.GetEnumerator();
Ezt követően egy while ciklussal könnyedén végigmehetünk az összes elemen, melynél a MoveNext függvény fogja mindig a következő elemet szolgáltatni.
Itt kiolvassuk a Cache bejegyzés nevet.
Amelyben ellenőrizzük, hogy a név tartalmazza-e az általunk választott szöveg konstanst, vagy valamilyen más objektumról van esetleg szó.
if (s.IndexOf("OverLoadIPAddress") != -1)
{
Ha IP címet tároló objektumot találunk, akkor ellenőrizzük, hogy annak értéke egyezik-e a paraméterként kapott IP címmel.
if (de.Value.ToString() == ip)
{
Ha igen, akkor az adott IP cím már szerepel a Cache-ben, így növelhetjük a számlálót.
Visszatérési értékként pedig akkor adunk igaz értéket, ha a számlálónk nem haladta meg a tízet, vagyis a kérés még kiszolgálható.