FILTERLAR (LOGLAMA)
Filtreler asp.net mvcde sunucuya gelen istekler gerçekleşmeden ya da gerçekleştikten sonra çalışan işlemlerdir ne zaman çalışacağı uygulamayı yazan kişi tarafından belirlenir.
ACTION FILTER
Bir action çalışmadan hemen önce ve çalıştıktan hemen sonra çalışan filtrelerdir.Genelde bir action ne zaman çalışmaya başladı ne zaman çalışması durdu veya o sırada onunla ilgili herhangi bilgileri tutmaya yarar. Bu sayede kullanıcı kaynakli bir sorun ortaya çıktıgında müdahaleyi kolaylaştırır. Şimdi aşama aşama bir action filter nasıl oluşturulur bakalım.
1 . Action’a ait model oluşturma : yapacağımız şey actiona ait bir model oluşturup action çalışmadan hemen önce ve çalıştıktan hemen sonra tutucağımız bilgilerin modelini hazırlamak. Biz action çalışmadan önce ve sonra action’un hangi controllere ait oldugu hangi action oldugu çalışmaya ve bitmeye başladıgı tarihi ve de filterin action çalışmadan önce mi yoksa sonra mı kayıt tuttugu bilgilerini kaydedelim. Model klasörünün içine LogBilgi adında bir model(class) tanımlayalım.
public class LogBilgi { public string Controller { get; set; } public string Action { get; set; } public DateTime IslemTarih { get; set;} public string Tip { get; set; } }
Bu özellikler ile filter çalıştıgında ve bittiğinde bu bilgiler kayıt altına alınacaktır.
2 . Log un tanımlanacagı kısım
Projenizin içine bir klasör açın ve bu klasörün içine bir class oluşturun. Bu classın içinde esas filterlarimizi tanımlayacagız. Ve oluşturdugunuz bu class’ı IActionFilter interacesi ile implement ediniz.
IactionFilter’ ini biraz daha yakından inceleyelim.
Kendisi isminin başındaki I dan da anlaşılcagı üzere bir Interface’dir . İçerisinde 2 adet abstract metot bulunmakta ve bu metotlar interface’yi implement eden sınıflar tarafından doldurulmayı beklemektedir.
public void OnActionExecuted(ActionExecutedContext filterContext); metodu isminden de anlayacagınız üzere action’un çalışması bittiği an çalışır ve gerekli kayıtları alır.
public void OnActionExecuting(ActionExecutingContext filterContext); metodu isminden de anlayacagınız üzere action’un çalışması başladıgı an çalışır ve gerekli kayıtları alır.
3.Log bilgisini tutacak modelimiz var Actionun çalışmasını belirleyecek classımız var. Eksik olan şey log bilgilerini tutacak bil veri class’ı normal şartlarda veri işlemleri veriTabanlariyla ( sql , mssql vs) yapılır ancak şuan her kitleyi düşünerek static veri kaydı oluşturacagız. Veri işlemlerinin yapıldığı model klasörünün içine bir adet LogVeri isminde class açıp içine yalnızca bunları yazınız.
private static List<LogBilgi> _loglar = new List<LogBilgi>(); public static List<LogBilgi> Loglar { get{return _loglar;} }
Daha sonra FilterAttribute class’ının içine geri dönüp implement ettiğimiz metotları dolduralım .
public void OnActionExecuted(ActionExecutedContext filterContext) { LogBilgi logKaydi = new Models.LogBilgi { Controller = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName, Action = filterContext.ActionDescriptor.ActionName, IslemTarih = DateTime.Now, Tip="Sonra" }; LogVeri.Loglar.Add(logKaydi); } public void OnActionExecuting(ActionExecutingContext filterContext) { LogBilgi logKaydi = new Models.LogBilgi{ Controller = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName, Action = filterContext.ActionDescriptor.ActionName, IslemTarih = DateTime.Now, Tip = "Once" }; LogVeri.Loglar.Add(logKaydi); }
4. Artık HomeController Sınfımıza dönebiliriz.
log oluşturduk artık loglari görüntüleyeceğimiz bir sayfaya ihtiyacimiz var.
homeControllerin içine
public ActionResult Loglar() { return View(LogVeri.Loglar); }
tanımlayın ve bir adet view ekleyin.
Viewin Templatei List Model classı da model bilgi olucaktır.
Bunun anlamı View birşeyleri listeyen bir view olucak ve Visual Studio bunu otomatik olarak size saglıcak . Modelin LogBilgi olması da Listeleyeceği model şablonunu belirlemektir.
View da oluşturukduktan sonra artık loglamak istediğimiz metotlarin üstüne [log] ifadesini koyabiliriz
public class HomeController : Controller { [Log] public ActionResult Index() { return View();} [Log] public ActionResult About() { return View();} }
Siteye girip Index ve Abouta her tıkladığımızda ve o linklerden her ayrılışımızda kayıt tutulacaktır.
NOT : Bu log un metod’a özel değilde tüm actionlara özel olmasını yani controlleri kapsamasını istiyorsanız [log] ifadesini controllerin başına yazmalısınız.