ASP.NET Core 7 MVC 'ViewCountFilterAttribute' Sınıfı Ne İşe Yarar? Metotların ve Satırların Açıklamaları

post-thumb

 

> Bu sınıf, bir ASP.NET Core uygulamasında kullanılacak bir özelleştirilmiş bir filtre olan ViewCountFilterAttribute sınıfını tanımlamaktadır. Bu filtre, bir makalenin görüntülenme sayısını saymak ve bu sayının tekrar sayılmasını belirli bir süre boyunca engellemek amacıyla kullanılabilir.

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
    public class ViewCountFilterAttribute : Attribute, IAsyncActionFilter

> İşte bu sınıfın metotları ve nasıl çalıştığına dair açıklamalar:

> OnActionExecutionAsync Metodu: Bu metot, IAsyncActionFilter arayüzünden uygulandığı için, belirtilen bir eylem gerçekleştiğinde (örneğin bir Controller Action'ı çağrıldığında) otomatik olarak tetiklenir.

 public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            var postId = context.ActionArguments["postId"];
            if (postId is not null)
            {
                string postValue = context.HttpContext.Request.Cookies[$"post{postId}"]; //article10 article15 gibi
                if (string.IsNullOrEmpty(postValue))
                {
                    Set($"post{postId}", postId.ToString(), 6, context.HttpContext.Response);
                    var postService = context.HttpContext.RequestServices.GetService<IPostService>();
                    await postService.IncreaseViewCountAsync(Convert.ToInt32(postId));
                    await next();
                }
            }
            await next();
        }
  • ActionExecutingContext context: Bu parametre, işlem başlamadan önceki bağlam bilgilerini içerir.
  • ActionExecutionDelegate next: Bu parametre, sıradaki filtre veya eylemi çalıştırmak için kullanılır.

> Bu metot, eğer talepte postId adında bir parametre varsa, bunu alır. Eğer postId değeri boş değilse (yani bir makaleye aitse), bu makalenin daha önce okunup okunmadığını kontrol eder. Eğer daha önce okunmamışsa, postId ile belirtilen makalenin görüntülenme sayısını artırır ve bir süreliğine (örneğin 6 saat) tekrar sayılmasını önler. Sonra next() çağrısıyla sıradaki filtre veya eylemin çalıştırılmasını sağlar.

 

> Set Metodu: Bu metot, bir çerez (cookie) oluşturur ve belirli bir süre boyunca saklar.

 /// <summary>  
        /// set the cookie  
        /// </summary>  
        /// <param name="key">key (unique indentifier)</param>  
        /// <param name="value">value to store in cookie object</param>  
        /// <param name="expireTime">expiration time</param>  
        public void Set(string key, string value, int? expireTime, HttpResponse response)
        {
            CookieOptions option = new CookieOptions();

            if (expireTime.HasValue)
               option.Expires = DateTime.Now.AddHours(expireTime.Value);           
            else
                 option.Expires = DateTime.Now.AddDays(1);

            response.Cookies.Append(key, value, option);
        }
  • key: Oluşturulan çerezin adı.
  • value: Çerezde saklanacak değer.
  • expireTime: Çerezin ne kadar süre boyunca geçerli olacağı (null ise varsayılan olarak 1 gün).
  • response: HTTP yanıt nesnesi.

> Remove Metodu: Bu metot, belirtilen bir çerezi siler.

/// <summary>  
        /// Delete the key  
        /// </summary>  
        /// <param name="key">Key</param>  
        public void Remove(string key, HttpResponse response)
        {
            response.Cookies.Delete(key);
        }
  • key: Silinecek çerezin adı.
  • response: HTTP yanıt nesnesi.

> Bu filtre, makale görüntülenmelerini takip etmek ve istenmeyen tekrar sayımı önlemek için kullanılabilir. expireTime parametresi, çerezin ne kadar süre boyunca geçerli olacağını belirler. Bu örnekte 6 saat olarak ayarlanmış, bu da bir kullanıcının aynı makaleyi okuduğunda 6 saat boyunca ViewCount değerinin tekrar saymadığını gösterir. Bu değer belirtilmez ise varsayılan olarak 1 gün olarak atanır. Bu süreyi ihtiyacınıza göre ayarlayabilirsiniz.

> Aşağıda, ViewCountFilterAttribute'un nasıl kullanılacağını anlatacağım:

  • Öncelikle, bir Controller Action'ı (örneğin "Detail" adında) oluşturmalısınız ve bu Action'ı [HttpGet] attribute'ü ile işaretlemelisiniz.
[HttpGet]
[ViewCountFilter]
public async Task<IActionResult> Detail(int postId)
{
    // Burada makale detayını gösterme işlemleri yapılabilir
}
  1. Action'ınıza [ViewCountFilter] attribute'ünü eklediğinizde, ViewCountFilterAttribute'un OnActionExecutionAsync metodunun içeriği otomatik olarak çalıştırılacaktır.
  2. OnActionExecutionAsync metodunda, talep edilen postId değerini alıp bu makalenin daha önce görüntülenip görüntülenmediğini kontrol edeceksiniz. Eğer daha önce görüntülenmemişse, görüntülenme sayısını artıracak ve çerez oluşturacaksınız.
  3. Çerez oluştururken, Set metodunu kullanacaksınız. Bu metod ile çerezin adını (key), içeriğini (value), süresini (expireTime) ve HTTP yanıt nesnesini (response) belirleyeceksiniz. expireTime parametresi çerezin ne kadar süre boyunca geçerli olacağını belirler.
  4. Eğer bir makale tekrar görüntülenmesini engellemek isterseniz, expireTime parametresini ayarlayarak belirli bir süre boyunca tekrar sayılmasını önleyebilirsiniz. Örneğin, bu örnekte expireTime parametresi 6 saat olarak ayarlandı.

Böylece, ViewCountFilterAttribute filtresini kullanarak bir makalenin görüntülenme sayısını sayabilir ve tekrar sayılmasını belirli bir süre boyunca engelleyebilirsiniz. Bu sayede kullanıcılar aynı makaleyi belirli bir süre içinde tekrar tekrar görüntülediğinde sayımın tekrarlanmasını önlemiş olursunuz.