C# Kod Standatları ve En İyi Programlama Teknikleri – Bölüm 1

30 Eki
  1. Giriş
  2. İsimlendirme ve standartları
  3. Girintiler ve aralıklar
  4. Doğru programlama teknikleri
  5. Mimari
  6. ASP.NET
  7. Yorumlar
  8. Hata ayıklama

Giriş

C# Kodlama standartlarının anlatıldığı 8 bölümlük serimize giriş yapmış bulunuyoruz.

Herkes birkaç aylık programlama eğitimi sonrasında kod yazar hale gelebilir. Kolayca çalışan uygulamalar ortaya çıkarabilir. Ancak işi doğru bir şekilde yapmak, daha fazla çalışma gerektirir.

Şuna inanmak gerekir ki programcıların çoğu “çalışan kod” değil “iyi kod” yazmak ister. “İyi kod” yazmak öğrenilmesi gereken gereçek bir sanattır.

“İyi kod” yazmanın tanımını herkes farklı bir şekilde yapabilir. Bence iyi kodun şu özellikleri taşıması gerekir.

  • Güvenilir olamlıdır.
  • Sürdürülebilir olmalıdır. Yani bakımı kolay olmalıdır.
  • Verimli olmalıdır.

Birçok geliştirici kodun sürdürülebilir ve güvenilir olmasından çok, yüksek performanslı olmasını göz önünde tutar. Ancak uzun vadede (Yatırım açısından) verimlilik ve performans, güvenilirlik ve bakımdan sonra gelir. Yazdığınız kod güvenilir ve sürdürülebilir değilse, siz (veya şirketiniz) her defasında sorunların tespiti ve uygulamanın akışını anlayabilmek için çok fazla zaman harcamak zorunda kalacaktır. Unutmayın, yapılan her fazla mesainin ardında plansız yapılmış işler vardır.

Microsoft ASP.NET takımından Syn. Stephen Walter bir hikayesinde yazılım geliştirmeye ilk başladığı zamanlarda iyi yazılım için “Good software is software that works as you intended.” diyoru. Yani iyi yazılım istediğiniz gibi çalışan yazılımdır. Ancak daha sonraları büyük şirketlere girdiğinde geliştirilen yazılımın odak noktasının hızlı yazılım üretmek değil, yazılan kodun bakımının kolay olması olduğunu görüyor. Stephen Walter fikrini değiştiriyor ve “Good software is software that works as you intended and that is easy to change” diyor. Yani iyi yazılım bakımı kolay olan ve istediğiniz gibi çalışan yazılımdır diyor.

Serinin devamında isimlendirme ve standartları ile kodlama olaylarını örneklerle anlatarak devam ediyor olacağız.

Asp.net MVC Razor Hepler ile Durum Çubuğu Yapmak

15 Eyl

Bu yazıda tamamen kendi emeklerimizle, jquery veya başka hazır kütüphane yardımı almadan bir ilerleme çubuğu(progres bar) yapmaya çalışacağız.

Yeni bir ASP.NET MVC projesi yaratarak işe başlıyoruz.

Projelerde genellikle ingilizce değişken adları kullanmaya çalışıyorum ki yazının ingilizcesini hazırlarsam çalışan örnek projeyi değiştimeye gerek kalmasın.

Örnek projede içiçe iki div etiketleri kullanıyoruz. Dıştaki div kapsül, içteki div ise durumu göstermeye yarayacak.

Çalışan uygulama görüntüsünü şu şeklide verelim ki daha fazla merak uyandırmadan düşünce geliştirmeye geçelim.

Yukarda görüldüğü gibi iç içe iki div etiketi içersinde son duruma ait yüzdelik gösterim yapılmış durumda.

İlk olarak css dosyamız içerisinde durum göstergesi için gerekli ayarlamalar şu şekilde belirliyoruz.

#progressBar{
   border:1px solid #4771a5;
   height:15px;
}

#progressInner{
   background-color:#96b1d2;
   height:15px;
}

Daha sonra razor view ortamında bir helper kodluyoruz. Helper ise aşağıdaki şekilde olacaktır.

@helper  ProgressBar(double BarWidth, double InnerWidth){

   BarWidth = BarWidth < 0 ? 100 : BarWidth;
   InnerWidth = InnerWidth < 0 ? 100 : InnerWidth;
   BarWidth = BarWidth > 400 ? 400 : BarWidth;

   InnerWidth = InnerWidth > BarWidth ? InnerWidth = BarWidth : InnerWidth;

   string barWidth = BarWidth.ToString() + "px";
   string innerWidth = InnerWidth.ToString() + "px";
   string persantage = ((int)(InnerWidth / BarWidth * 100)).ToString()+"%";

   <div id="progressBar"  style="width:@barWidth">
       <div id="progressInner" style="width:@innerWidth"></div>
   </div>
   <label>@persantage</label>

}

Yukarda ProgressBar adında bir helper oluşturulmuş durumda. Helper içerisinde kullanıcının abuk değerler verip gösterge çubuğunu sapıtmaması için bir dizi önlemler alıyoruz. Bar ve Inner değerinin sıfırdan küçük veremesin, dolan mavi kısım Bar değerini geçemesin v.s gibi. Duruma göre daha fazla önlem alınabilir.

Burada dikkat edilmesi gereken husus şudur ki, html etiketlerinin css özellikleri dinamik olarak değişmektedir.

Geriye kaldı ki bu helper nasıl kullanılacak. O da şu şekilde.


<h2>Razor Helper Progress Bar</h2>

@ProgressBar(300, 120)

Evet sadece bu kadar. ProgressBar helper’ı artık farklı denemelerle kullanılabilir duruma getirdik.

Nerelerde kullanılabilir?

Veritabanından çekilen değerleri göstermek için ideal bir yöntem olabilir. Örneğin bugün en çok satış yapan çalışanın yaptığı satış bugün yapılan toplam satışların yüzde kaçına tekabül ediyor.

Neden bununla uğraşalım?

Çünkü koda tamamen hakimiz. Yukardaki örnekte Bar yüksekliğini css içerisinde sabitledim. İstersek dışarı çıkarıp Width özelliği gibi dinamik hale getirebiliriz.

Soru: Sizce ProgressBar metodunda double parametreler string dönüşümü yapılmadan style içersine nasıl yerleştirilir?

Uygulamanın çalışan kodları buradadır.

Umarım faydalı olmuştur herkese iyi çalışmalar.

Silverlight Client Access Policy ve Cross-Domain sorunu

8 Eyl

Bu yazımızda silverlight uygulamasına başka bir site veya projedeki servisi referans verdiğimizde karşılaşılan sorunlardan ve çözümlerinden bahediyor olacağız.

Sorun: Tarayıcıların çalıştıkları domain dışından veri alma ve gönderme sorunu. Bu demek oluyor ki silverligth uygulamsından, dışardaki bir uygulamaya ulaşmak istediğimizde cross-domain problemi ile karşılaşacağız.

Bir uygulama üzerinden gidecek olursak, bir solution üzerine CrossService adında bir WCF Service Application birde Silverlight Application ekleyerek başlayabiliriz.

CrossService projesine başka bir alan adı muamelesi yaparak FarService adında bir servis ekliyoruz. Bu servisimiz içerisinde basit olması açısından mesaj veren bir metod barınmaktadır.
IFarService interface


[ServiceContract]
public interface IFarService
{
    [OperationContract]
    string  ServiceMessage();
}

FarService sınıfı


public class FarService : IFarService
{
     public string ServiceMessage()
     {
       return String.Format("Ben Uzak servisten geliyorum. Tahih :{0}", DateTime.Now);
     }
}

Silverlight uygulamamızın barındığı web uygulamasına ise aynı domainde bulunduğunu belirtmek açsından LocalService adında bir servis ekliyoruz.

ILocalService interface

[ServiceContract]
public interface ILocalService
{
    [OperationContract]
    string  ServiceMessage();
}

LocalService sınıfı

public class LocalService : ILocalService
{
    public string ServiceMessage()
    {
         return String.Format("Ben Yakın servisten geliyorum. Tahih :{0}", DateTime.Now);
    }
}

Şu anda servislerimiz hazır ve uygulamaya dahil edilmeye hazır.
Silverlight uygulamamıza Add Service Reference… diyerek referansları ekliyouz.

Referanslar eklendiğinde aşağıdaki görüntü oluşacaktır.

Artık servis referansları yardımıyla servislerdeki ServiceMessage() metodlarını çağırabiliriz.

MainPage.xaml sayfasının tasarım kısmını şu şekilde düzenliyouz.

Kod kısmına gelecek olursak:

public partial class MainPage : UserControl
{
    FarServiceReference.FarServiceClient uzakServis
                  = new FarServiceReference.FarServiceClient();

    LocalServiceRefference.LocalServiceClient yakinServis
                  = new LocalServiceRefference.LocalServiceClient();

    public MainPage()
    {
        InitializeComponent();
    }

    private void btnUzak_Click(object sender, RoutedEventArgs e)
    {
        uzakServis.ServiceMessageAsync();
        uzakServis.ServiceMessageCompleted += (snd, ea) =>
        {
            lblUzak.Content = ea.Result;
        };
    }

    private void btnYakın_Click(object sender, RoutedEventArgs e)
    {
        yakinServis.ServiceMessageAsync();
        yakinServis.ServiceMessageCompleted += (snd, ea) =>
        {
           lblYakin.Content = ea.Result;
        };
   }
}

Görüldüğü üzere iki butondan biri uzak servisi diğeri yakın servisi çağırıyor olacak. Sonrasında servislerden gelen mesajlar  Label üzerine aktarılıyor olacaktır.

Yakın serviste bir sorun yok şu anda. Acak uzak servis için CrossService projesi içinde clientaccesspolicy.xml adında bir dosya mevcut. Silverlight uzak alan adına gittiğinde bu dosya mevcut mu diye bakar. Ki bu dosya içierisindeki ayarlara göre erişim yetkisine sahip mi değilmi anlayacak.

Xml dosya içeriği şu şekilde olacaktır:

 <?xml version="1.0" encoding="UTF-8"?>
 <access-policy>
   <cross-domain-access>
    <policy>
     <allow-from http-request-headers="*">
      <domain uri="*"/>
     </allow-from>
    <grant-to>
      <resource include-subpaths="true" path="/"/>
    </grant-to>
    </policy>
  </cross-domain-access>
 </access-policy>

Dikkat: Eğer clientaccesspolicy.xml dosyası uzak uygulamada olmasaydı şu şekilde bir sorunla karşılaşacaktık.

Hata: “An error occurred while trying to make a request to URI ‘http://localhost:1763/FarService.svc’. This could be due to attempting to access a service in a cross-domain way without a proper cross-domain policy in place, or a policy that is unsuitable for SOAP services. You may need to contact the owner of the service to publish a cross-domain policy file and to ensure it allows SOAP-related HTTP headers to be sent. This error may also be caused by using internal types in the web service proxy without using the InternalsVisibleToAttribute attribute. Please see the inner exception for more details.”

Uygulamanın çalışan kodunu buradan indirebilirsiniz. Umarım faydalı olmuştur. Herkese iyi çalışmalar.

Asp.net Mvc Model Binding

5 Eyl

MVC mimarisinde açıklanması gereken bir konu da Model Binding konusudur. Bu yazıda Model Binding konusunu incelemeye çalışacağız.

Tanım: Model Binding HTTP request ile gelen verilerinin ayrıştırılarak ilgili Controller’da bulunan Action metod parametrelerine ve uygun .NET tiplerine dönüştürülmesi işlemidir.

Eğer bir action metod parametre almışsa Model Binding işlemi gerçekleşmektedir.

Arka planda gerçekleşen olaylar: Şimdi aşağıdaki gibi Index adında, string türünde bir tane parametre alan bir Action metod olduğunu varsayalım.

public ActionResult Index(string name)

Index Action’ı çağırılmadan önce arka plan işlemlerini yönetecek iki önemli bileşen vardır. Bunlar ValueProviderDictionary ve DefaultModelBinder’dır.

ValueProviderDictionary: HTTP request ile gelen parametreleri çekerek string halinde depolar. Bu işlem aşağıdaki sırayla gerçekleşir.

  • Request.Form[“name”] var mı diye bakar.
  • Yoksa RouteData.Values[“name”] var mı diye bakar.
  • Yoksa Request.QueryString[“name”] var mı diye bakar.
  • Yoksa null değer döndürür.

Böylece ValueProviderDictionary  HTTP request ile gelen değerleri elde etmiş olur.

DefaultModelBinder: ValueProviderDictionary sınıfının elde ettiği değerleri uygun .NET objelerine gönüştürme görevini üstlenir. Yukardaki örnekte “name” parametresi zaten string tipindedir. Bu durumda DefaultModelBinder dönüşüm yapmak durumunda değildir. Fakat aşağıdaki gibi int veya başka türde parametre alan Action metodlar olabilir.

Durum 1

public ActionResult Index(int id, decimal rate)

Bu durumda DefaultModelBinder sınıfı parametre tip dönüşümlerini otomatik olarak yapacaktır.

Durum 2

Şu ana kadar olan kısımda HTTP request ile gelen isteklerin ayrıştırılıp uygun .NET tiplerine dönüştürüldüğünü gördük. Ancak aşağıdaki gibi özel bir tipin modele bind edilmesi gereken bir durum sözkonusu olabilir.

public ActionResult Index(Person person)

DefaultModelBinder yukarıdaki gibi özel bir .NET tipi ile (Person) karşılaştığında Reflection yardımına koşar. Reflection sayesinde özel tipe ait tüm public özellikler ValueProviderDictionary sınıfı tarafından sağlanan değerleri alır.

Binding

Model binding işlemini bu noktadan itibaren bir örnek yardımıyla incelemeye çalışalım. Örneğimizde bir Person model nesnesinin nasıl bind edildiğini inceliyor olacağız.

public class Person
{
     public int Id { get; set; }
     public string FirstName { get; set; }
     public string LastName { get; set; }
}

Autoproperty’ler yardımıyla oluşturulmuş Person model tipimiz yukarıda basit bir şekilde oluşturulmuş durumda.

View tarafında bir form oluşturularak, oluşturulan formun Controller tarafında bir action metoda post edilmesi gerekmektedir.

@model MvcModelApp.Models.Person 

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Kişi Bİlgileri</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.FirstName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.FirstName)
            @Html.ValidationMessageFor(model => model.FirstName)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.LastName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.LastName)
            @Html.ValidationMessageFor(model => model.LastName)
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

Controller tarafında ise DefaultModelBinder tarafından doldurulmuş person nesnesinin kullanılması gerekmektedir.

      [HttpPost]
        public ActionResult CreatePerson(Person person)
        {
            // person nesnesi form bilgileri ile doldurulmuş durumda
            // person nesnesi artık gerekli işlem için 
            // (database, xml kaydı v.s) kullanılabilir

            return RedirectToAction("Index", "Home");
        }

Yukarıdaki action metodunun parametresi olan Person nesnesi DefaultModelBiner tarafından doldurulmuştur.  @model MvcModelApp.Models.Person ile view sayfasının modelinin belirlendiğini görüyoruz. Controller tarafında CreatePerson metoduna post edilen form bilgileri Person nesnesine doldurulmaktadır.

Bu işlem şöyle gerçekleşmektedir: DefaultModelBinder action metodun aldığı parametre tipinden (Person) bir nesne oluşturarak Property’lerini view sayfasından gelen form bilgileri ile eşleştirerek doldurmaktadır.

Umarım faydalı bir yazı olmuştur. Herkese iyi çalışmalar. Bir sonraki yazıda görüşmek üzere.

C# Dilinde Kullanılan Faydalı Operatörler

28 Ağu

(??)  “null coalescing” Null kontrol operatörü

Bu operatör nullable(null değer alabilir) bir değişkenin null oluğ olmadığını kontrol eder.

Örnek:
               string name = "Product";
               string info = name ?? "product name is null"

(?:)  Mantıksal Sınama Operatörü

Bu operatör mantıksal bir sınamayı ifadeyi temsil eder. if sınamasının kısa yazım şeklidir.

Kullanımı:
               condition ? first_expression : second_expression;
               şart ? birinci_durum : ikinci_durum;

Örnek:
               if(x != 0.0) s = Math.Sin(x)/x; else s = 1.0;
               s = x != 0.0 ? Math.Sin(x)/x : 1.0;

Nullable<> (?) operatörü

Örnek: public int? Command { get; set; } şeklindeki bir tanımlamada ? ile Command property’nin null değer alabileceği ifade ediliyor.

Örnek:
              public Nullable<int> Command {get; set;}

(::) operatörü

Bazı kütüphanelere extern alias tanımlaması yapılır. Harici isim takma şeklinde Türkçeleştirilebilir. .NET’te birçok noktada global:: şeklinde tanımlamalar bulunur. Amaç aynı isimdeki sınıfların birbirini ezmesini engellemek ve her iki sınıfada farklı isimler vererek kullanıma sunmaktır.

Örnerk:
              public global::System.Int32 id

Asp.net MVC ActionMethodSelector Attribute

26 Ağu

Bu yazımızda controller action metodları çalıştığı durumlarda action metodunu kontrol eden kendi attribute sınıfımızı nasıl oluşturabileceğimiz üzerinde duracağız. Kendi özel attribute sınıfımızı oluşturmak için yazdığımız sınıfı ActionMethodSelectorAttribute sınıfından türetmemiz gerekiyor.

Bu sınıf ileri düzeyde oluşturulmuş bir sınıf olacak. Miraslama işlemi ile oluşturduğumuz sınıfa ActionMethodSelectorAttribute sınıfından gelen IsValidForRequest() adında tek bir metod olacaktır.

    public class AjaxMethod : ActionMethodSelectorAttribute

{

public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)

{

if (!controllerContext.HttpContext.Request.IsAjaxRequest())

{

throw new Exception(“Bu metod [” + methodInfo.Name + “] sadece Ajax request için tanımlanmıştır.”);

}

 

return true;

}

}

 

Oluşturulan attribute bir action metoda şu şekilde uygulanmaktadır:

        [AjaxMethod]
        public ActionResult Unknown()
        {
            return View();
        }

Eğer Unknown() metoduna Ajax request haricinde bir request gelirse aşağıdaki gibi bir hata sayfasıyla karşılaşıyor olacağız.

Bir sonraki yazıda görüşmek üzere herkese iyi çalışmalar.

Asp.net MVC Action Kontrolü ve Action Attribute

25 Ağu

Bu bölümde controller sınıfımızdaki action metodları nasıl kontrol edilebileceği vebu metodlara erişim izinlerini belirleyen ve bu metodları bir anlamda özelleştiren bazı attribute’lerden bahsedeceğiz. İnceleyeceğimiz bazı attribute’ler:

  • AcceptVerbs
  • ActionName
  • ActionMethodSelector

AcceptVerbs Attribute

Bu attribute action metoduna HTTP operasyonları yardımıyla erişme izinlerini belirler. Bir action metoduna sadece HTTP Get metoduyla ya da Post metoduyla erişilmesini isteyebiliriz. Bu durumda ilgili action metodumuz AcceptVerbs attribute ile işaretlememiz gerekecektir.

Bir employee controller sınıfımıza ait Create() metodu olduğunu varsayacak olursak bu noktada iki adet Create() action metoduna ihtiyacımız olacaktır. Birinci metod HTTP GET operasyonu ile metodu ile çağrılmalı ve form sayfasını karşımıza çıkarmalı, ikinci metod ise form doldurulduktan sonra HTTP POST metodu ile verilerin alınarak işlenmesini sağlayacaktır.

// GET: /Employee/Create

[AcceptVerbs(HttpVerbs.Get)]

public ActionResult Create()

{

return View();

}
// POST: /Employee/Create

[AcceptVerbs(HttpVerbs.Post)]

public ActionResult Create(Employee employeeToCreate)

{

try

{

//Kayıtları yap…

return RedirectToAction(“Index”);

}

catch

{

return View();

}

}

Bu durumda bowser ortamından /Employee/Create şeklinde çağırdığımızda eğer controller oluşturulmamışsa hata raporu gözükecektir.

The resource cannot be found.

Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable.  Please review the following URL and make sure that it is spelled correctly.

Requested URL: /Employee/Create

Bu hatanın sebebi, henüz Employee adında controller oluşturulmamış olmasıdır.

Employee adında bir Controller oluşturulduktan sonra ve bir Create action metod oluşturulursa sorun çözülmüş olacaktır.

Action metodlarını HTTP operasyonlarıyla işaretlemenin bir diğer yolu ise aşağıdaki şekildedir. [AcceptVerbs(HttpVerbs.Post)] yazımının kısa yazılmış şeklidir.

        [HttpGet]
public ActionResult MyAction()

{

return View();

}

Bu metod daha kullanışlıdır. Hazır oluşturulmuş attributeler yazdımıyla işaretlemeler yapılmaktadır.

HTTP operasyonlarından en çok bilinen POST ve GET operasyonlarıdır. Diğer operasyonlar DELETE, PUT, HEAD, TRACE, CONNECT.

Asp.net MVC 4 Yol Haritası

24 Ağu

Microsoft ASP.NET MVC 4 Yol haritasını yayınladı. Tabi bu yol haritası üzerinde değişklikler yapılabilmesi muhtemel geçici bir bakış açısı gibi duruyor. Bu yol haritasında dikkat çekici üç hazırlık mevcut. Bunlar yeni araçlar (tooling), genişletilmiş mobil platform desteği ve bulut tabanlı (cloud based) çözümler.

ASP.NET MVC takımındaki bir diğer çalışma ise Genişletilebilir Görev Tabanlı Araçlar (Recipes = (Extensible Task-Based Tooling). Örneğin view katamnında bir datagridi doldurup göstermek için önce data-access sınıfları hazırlanır, sonra controller tarafında veriler bir model doldurulur ve view katmanına sunulur. Bu çözümler (Recieps) denilen araçlar bu işlemlere yardım edecek. Kullanıcılar kendi çözümlerini de kendileri yazabilecekler. Yazılan çözümler bir arayüz vasıtası ile uygulamaya dahil edilebiliyor olacak.

Smartphone ve tablet tarafından olaya baktığımızda Microsoft ASP.NET MVC takımı template vb. yöntemlerle ASP.NET MVC 4 web sayfalarının mobil versiyonuna daha iyi destek vermeyi düşünüyor. Aşağıda MVC3 ve MVC4 ile yapılmış web sitelerinin mobil ortamda görüntülerini incelediğimizde farkı daha iyi anlamış olacağız.


Ele alınan bir başka değişiklik ise özellikle tablet ve mobil cihazlar için yeni bir proje şablonu. Bu şablonun da görünümü yine aşağıdaki gibi olacak:


Tabi bu kadarla da kalmayıp aygıta göre View oluşturma imkanı da gelen yeni yenilikler arasında. Örneğin mobil aygıtlar için oluşturulan bir View .mobile uzantılı olacak. Aşağıdaki resimde view katmanının görünümü verilmiştir:

Asp.net MVC ve ELMAH ile Hata Log Kaydı

22 Ağu

Web uygulamalarımızı yaparken tüm kontrol elimizde olsun isteriz. Kontrol etmek istediğimiz noktalardan birisi de süreç işlerken oluşan hataların neler olduğudur. Yani bir kullanıcı sistemde işlem yaparken bir hata ile karşılaştığında işleminin neden yarıda kesildiğinden haberdar olmak isteriz. Yazdığımız kodlardaki bug’lar olsun, sunucu kaynaklı sorunlar olsun sorunun ne olduğu, ne zaman meydana geldiği hatta hangi kullanıcının bu sorunu yaşadığı kaydedip incelemek istediğimiz durumlardır.

Bu noktada yazılmış hata yöneticilerinden biri de ELMAH (Error Logging Modules and Handlers) kütüphanesidir. Bu kütüphane süreç işlerken oluşan hataları detaylı olarak kaydeder.

Oluşan Log kayıtlarını birçok ortamda depolayabiliriz. Bu depolama ortamları:

Burada dikkat etmemiz gereken noktalardan biri oluşan hata loglarını nereye kaydedeceğimizi belirlemektir. Biz kayıtları XML dosyada tutacağız.

ASP.NET MVC projesine ELMAH kütüphanesini dahil etmek için Nuget Package Manager eklentisini kullanıyor olacağız.

Package Manager Console açarak Install-Package elmah.xml komutunu giriyoruz. Kurulum otomatik olarak gerçekleşiyor. Web.config dosyası içerisinde ayarlamalar otomatik olarak yapılıyor. Hata kayıtlarının nerede tutulacağını belirleyen kısım ise aşağıdaki gibidir.

  <elmah>   
    <errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="~/App_Data/Elmah.Errors" />
  </elmah>

Yükleme işlemi gerçekleştikten sonra HomeController içersine About adında bir index belirliyoruz ve bu metodun hata fırlatmasını sağlıyoruz.

 

http://localhost:1735/Home/About şeklinde çağırdığımızda meşur sarı hata sayfasıyla karşılaşıyoruz. (1735 portu kendi makinamın verdiği port numarası, sizin denemenizde bu numara farklı olabilir.)

Bu hata kaydı  App_Data/Elmah.Errors dizininde XML dosya içersine kaydedilmiş olacak. Hata kaydını görmek için http://localhost:1735/elmah.axd yoluna bakıyoruz ve aşağıdaki şekilde başarılı sonuca ulaşmış oluyoruz.

Global.asax Applicarion_End, Applicarion_Start, Session_End, Session_Start

22 Ağu

Global.asx dosyası içinde oturum açıldığı ve kapandığı sırada ya da uygulama ayağa kalktığında veya sonlandığında gerçekleşen ve açıklanmayı bekleyen bazı olaylar vardır. Bunlardan birkaçını açıklamaya çalışalım.

protected void Application_Start()

{

System.Diagnostics.Debug.WriteLine(“Application_started”);

 

AreaRegistration.RegisterAllAreas();

 

RegisterRoutes(RouteTable.Routes);

}

 

protected void Session_End(object sender, EventArgs e)

{

System.Diagnostics.Debug.WriteLine(“Session_End”);

}

 

protected void Session_Start(object sender, EventArgs e)

{

System.Diagnostics.Debug.WriteLine(“Session_Start”);

}

 

protected void Application_End()

{

System.Diagnostics.Debug.WriteLine(“Application_ended”);

}

 

Application_Start() metodu uygulama ilk çalıştırıldığında tetiklenecektir. Yani uygulamanın ApplicationDomain’i yaratıldığında oluşturulur. Her .Net Process’i default olarak bir tane Application domain’i içerir; bu application domain CLR tarafından işlemin başlatılması ile otomatik olarak yaratılır.

Application_End() metodu uygulama son bulduğunda tetiklenecektir.         Yani uygulamamız ApplicationDomain’den çıkarıldığında çalışacaktır.

Session_Start() metodu uygulamamıza bir istek geldiğinde tetiklenecektir. Daha basit bir anlatımla kullanıcı siteye girdiğinde çalışacaktır.

Session_End() metodunu kullanıcı hareketleriyle yakalamak imkansızdır. Yani kullanıcı siteye girdi ve browser’ı kapattı. Browser kapandığında Session_End metodu çalışmaz. Çünkü browser kapanması sunucuya bir istek göndermeyecek. Dolayısıyla istek olmadığı için cevapta olmayacaktır. Bir session server tarafında varsayılan olarak 20 dakika tutulur. Kullanıcı 20 dakika boyunca hiçbir işlem yapmazssa session otomatik olarak sonlandırılır ve Session_End() metodu çalışır.