ASP.NET MVC 3 ve Elmah İle Hata Loglama

24. Mart 2012

Elmah (Error Logging Modules and Handler) kütüphanesi ASP.NET 2.0'dan beri kullandığım, ASP.NET web uygulamaları için hata loglama ve yönetimi kütüphanesi. Geliştirdiğim web uygulamalarında sadece birkaç ayar ile hata yönetimini çalışır hale getirebiliyor olmam, beni Elmah'a hayran bırakan özelliklerinden sadece biri. ASP.NET HTTP Handlers kullanımına verilebilecek en yaratıcı örneklerden biri, hatta muhtemelen en iyisi. 

ASP.NET MVC uygulamamızda Elmah'ı çalışır hale getirmek için aşağıdaki adımları takip edebiliriz.

 

ASP.NET MVC 3 Web Uygulamasına Elmah Kurulumu

1. İlk yapmamız gereken solution'ımıza sağ tıklayıp "Manage Nuget Packages"a tıklayıp NuGet paketleri içerisinde Elmah diye aratıp Elmah MS SQL Server'ı seçmek. Başka veritabanları üzerinde loglama yapacak, veya logları dosya sisteminde XML olarak kaydedecek Elmah paketleri de göreceksiniz listede. Ben örneğimi SQL Server üzerinde geliştireceğim.

 

 

2. Elmah NuGet paketini uygulamanıza yükledikten sonra solution'ınızda references'te Elmah referansını göçrebilirsiniz. Aynı zamanda uygulamanıza App_Readme diye bir dizin eklenmiş, ve içerisinde Elmah.SqlServer.sql isminde bir dosya olmalı. İşte bu dosya Elmah'ın hata loglarken kullanacağı SQL Server tablosunun ve Stored Procedure'lerinin scriptlerini barındırıyor. Şimdi yapmamız gereken bu dosyayı uygulamamızın bağlanacağı SQL Server veritabanında çalıştırmak. 

 

 

 

3. Web uygulamamızın konfigurasyon dosyasını yani web.config'i açar isek, NuGet paketi yüklenirken konfigurasyon dosyamıza elmah diye bir bölüm tanımladığını ve içerisine Elmah'ın varsayılan ayarlarını yaptığını görebiliriz. İlk aşamada yapmamız gereken Elmah'ın veritabanına bağlanırken kullanacağı bağlantı cümleciğini (connection string) uygulamamızın kullandığı bağlantı cümleciğine eşitlemek. 

Elmah'ın kullandığı bağlantı cümleciği aşağıdaki bölümde yer almakta. 

 

<elmah>
    <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="elmah-sqlserver" />
</elmah>

 

connectionStringName değerini, webconfig dosyamızın connectionStrings bölümüne ekleyeceğimiz ve uygulamamızın kullanacağı bağlantı cümleciği ile değiştirebiliriz : 

<connectionStrings>
    <add name="connStr" connectionString="Data Source=INSTANCE;Initial Catalog=DB;Persist Security Info=True;User ID=USER_NAME;Password=SIFRE"
         providerName="System.Data.SqlClient" />
</connectionStrings>

<!-- ... -->

<elmah>
    <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="connStr" />
</elmah>

 

Eğer bağlantı cümleciğini doğru tanımladıysak Elmah şuan çalışır hale gelmiş olmalı. Test edebilmek için, web uygulamamızı çalıştıralım ve uygulamamızın ana dizininde elmah.axd'yi çağıralım. Yani henüz localhostta çalıştığımız için benim çağırdığım link şu şekilde : 

http://localhost:46352/elmah.axd

 

Loglanacak Hataların Filtrelenmesi

Farkedeceğiniz üzere henüz yeni bir ASP.NET MVC uygulaması açmış olmama rağmen tarayıcım favicon.ico dosyasını sunucudan talep etmiş fakat 404 yani dosya bulunamadı hatası almış, ve bu hatalar Elmah tarafından loglanmış. İyi haber, uygulamama eklediğim Elmah paketim başarıyla çalışıyor. Kötü haber tarayıcım varsayılan olarak web uygulamalarının favicon.ico dosyasını sunucudan talep ettiği için bu hata sunucuya gelen her talepte loglanıyor olacak.

Bunun önüne geçebilmek için web.config konfigurasyon dosyam içerisindeki elmah bölümünde aşağıdaki gibi filtre tanımı yapabilirim. errorFilter tag'ı ile loglamasını istemediğimiz logları filtreleyebiliriz :

<elmah>
<errorFilter>
  <test>
	<and>
	  <equal binding="HttpStatusCode" value="404" type="Int32" />
	  <regex binding="Context.Request.ServerVariables['URL']" pattern="/favicon\.ico(\z|\?)" />
	</and>
  </test>
</errorFilter>
</elmah>

 

Elmah Güvenlik Ayarları 

Web uygulamamızı geliştirip sunucuya taşıma vakti geldiğinde, elmah.axd sayfasına yetkisiz kişilerin girmesini ve hatalarımızı görmesini istemeyiz. Hata mesajları sakıncalı ve güvenlik açığı oluşturabilecek bilgiler içerebilirler. Bu yüzden, web uygulamamızı web sunucusuna taşırsak ve tarayıcımızdan elmah.axd kaynağını talep edersek HTTP 403 Erişim Engellendi hatası ile karşılaşırız. Elmah önyüzü varsayılan ayarlarda yalnızda localde çalışır. Bunu açıp, elmah.axd'yi uygulamamızın yönetim alanına almak için öncelikle yapmamız gereken, web.config içerisindeki elmah bölümü altına security tagını eklemek ve allowRemoteAccess değerini true olarak vermek : 

<elmah>
    <security allowRemoteAccess="true" />
    <errorFilter>
      <test>
        <and>
          <equal binding="HttpStatusCode" value="404" type="Int32" />
          <regex binding="Context.Request.ServerVariables['URL']" pattern="/favicon\.ico(\z|\?)" />
        </and>
      </test>
    </errorFilter>
</elmah>

Şu durumda elmah.axd sunucudan talep eden herkese açık hale geldi. Şimdi location tagı ile elmah.axd'yi sadece yetkili kullanıcılarca erişilebilir hale getirelim. Tabi bunu kullanabilmek için uygulamamızın kullanıcı yönetiminin geliştirilmiş olması gerekmektedir :

 

<location path="elmah.axd">
    <system.web>
      <authorization>
        <deny users="?" />
        <allow roles="admin" />
      </authorization>
    </system.web>
</location>

Sonuç

Bu günlük yazımı yazmaya başladığımda ilk aklıma gelen Java dünyasında geçirdiğim 9 ay oldu. Başarılı pek çok kütüphaneyi çalışır hale getirebilmek için konfigürasyon dosyaları arasında kaybolmak...

2dk sürmeyen ve sadece 3 adımda tamamladığımız Elmah kurulumu ile web uygulamamızın hata loglama işlemlerini yapabiliyor hale getirdik. Filtreleme ve güvenlik ayarlarına göz attık. Basit ve hızlı bir çözüm ile uygulamamızda hata loglamasını, kendini kanıtlamış bir kütüphaneye emanet etmiş oluyoruz.

, ,

HTML5 Eğitimi

5. Şubat 2012

HTML5 Logo3-4 Mart 2012 tarihinde Zenith Bilişim'de eğitmeni benim olacağım 12 saatlik bir HTML5 eğitimi planlıyoruz.

Bu eğitimde HTML5 ile gelen yeni doküman yapısından yeni taglara ve desteklenmeyen taglara,

Flash player'leri tarihe karıştıracak audio ve video taglarından HTML5 canvas'a,

local ve session storage ile veri saklama APIlerinden cache altyapısına,

Geolocation API ile lokasyon tabanlı uygulamalardan Messaging API ve Web Sockets ile veri akışına kadar HTML5'in heyecan verici dünyasına dalıp, örnekler ile HTML5'i öğrenmeye çalışacağız.

 

Eğitimde yer alacak konular : 

 

  • HTML5 nedir ?
  • HTML5 markup, doküman yapısı
  • Yeni form tagları ve form doğrulama.
  • Video ve Audio tagları ile multimedia.
  • HTML5 Canvas.
  • Local storage, session storage ve Web SQL Veritabanları ile veri saklama.
  • HTML5 ile caching ve offline içerik.
  • HTML5 Geolocation API.
  • HTML5 Web Messaging API.
  • Web Workers ile Threading.
  • Web Sockets.

 

Eğitim hakkında bilgi ve kayıt için cenk.ozdemir@zenithbilisim.com adresine mail atarak iletişim bilgilerinizi bırakmanız halinde size geri dönüş yapılacaktır.

 

Eğitim materyaline şu github projesinden ulaşılabilir : Html5 Örnekleri

,

nopCommerce Paypal Standart Ödeme Metodunda address_override Özelliği

19. Ocak 2012

nopCommerce açık kaynak e-ticaret uygulamasıE-Ticaret uygulamaları için ödeme metodlarından biri olan Paypal'a entegrasyon için paypal'ın sağladığı Payment Data Transfer metodu kullanılıyor.

nopCommerce e-ticaret uygulamasında bu ödeme metodunu aktif etmek için öncelikle Paypal hesabını ticari veya premium hesaba çevirip, PDT özelliğini aktif etmeniz gerekiyor.

Ardından nopCommerce yönetim panelinden ödeme seçenekleri ayarlarından Paypal Standart'ı seçip PDT ayarlarınızı kaydediyorsunuz ve e-ticaret uygulamanızın Paypal entegrasyonunu sağlamış oluyorsunuz.

Benzer bir Paypal entegrasyonunu yapmaya çalışırken şöyle bir sorun ile karşılaştım. E-Ticaret uygulamasındaki test hesabım ABD adresi ile kayıtlı iken, ödeme yapmaya çalıştığım hesap Türkiye adresi ile kayıtlı idi. 

Paypal default ayarlarda bu tarz durumları güvenlik sorunu olarak değerlendirip aşağıdaki gibi bir hata mesajı ile ödemeyi durduruyor : 

Paypal does not allow your country of residence to ship to the country you wish.

Bu sorunu aşmak için 2 yöntem mevcut. İlki uygulamamızı kullanan kullanıcıların uygulamamızda kayıtlı olan adres bilgileri ile kullandıkları Paypay hesabının adres bilgilerinin denk olmasını beklemek.

İkinci yöntem ise Paypal entegrasyonunda kullanılan parametrelerden address_override değişkeninin değerini "0" olarak paypal'a iletmek. address_override değişkeni, fatura adresi ile paypal hesabının denk olması kuralını aşmayı sağlayan bir parametre, gerekli bilgi Paypal'ın 

HTML Form Basics for Website Payments Standard adresinde mevcut.

Bu değişkenin değerini nopCommerce'de değiştirmek için maalesef Nop.Plugin.Payments.PayPalStandard plugin'ini değiştirmeniz gerekiyor. 

Şuan plugin kodunda görüldüğü üzere yazılım ekibi, bu özelliği Paypal Ayarları sayfasına eklemeyi planlıyor. Ama henüz eklenmiş durumda değil. İleride çıkacak nopCommerce sürümlerinden birinde bu seçenek yönetim sayfasında yerini alabilir.

1. Nop.Plugin.Payments.PayPalStandard projesini açın.

2. PayPalStandardPaymentProcessor.cs sınıfı içerisindeki PostProcessPayment metodu içerisindeki aşağıdaki satırı bulup değerini 0 olarak eşitleyin.

//TODO move this param [address_override]

//to settings (PayPal configuration page)

builder.AppendFormat("&address_override=0");

3. Plugin'i derleyin.

4. Projenin özelliklerinden göreceğiniz üzere projenin output path'i aşağıdaki gibi : 

    ..\..\Presentation\Nop.Web\Plugins\Payments.PayPalStandard\

        Nop.Plugin.Payments.PayPalStandard.dll

Bu dizinden plugin'nin dll'ini alıp web uygulamanızın Plugins\Payments.PayPalStandard dizinine atıp uygulamanızı restart ettiğinizde Paypal entegrasyonu artık address_override parametresi aktif edilmiş olarak çalışmaya başlayacaktır.

, , ,

WebUcundan Merhaba !

19. Ocak 2012

Üçüncü denemem sonuncu olacak. Ya önceki blog denemelerim gibi silinip gidecek, yada bu sefer kalıcı olacak. Diye motivasyonum üzerinde olumlu etki yapacağını düşündüğüm bir cümle ile merhaba günlüğüme başlamak istedim.

Amacım, öğrendiklerimi ve karşılaştığım problemlere bulduğum çözümleri sistematik olarak bir yerlerde tutabilmek. Bu notlarımı günlük sayfaları halinde paylaşırken aynı zamanda yararlı olabilmek, farklı deneyimler yaşamış arkadaşlarla fikir alışverişinde bulunabilmek.

Günlüklerimde web programlama ile alakalı karşılaştığım pratik çözümler, bir yerlerde gizli kalmış özellikler, yeni trendler ve eski güzel günlerden bahsetmeye gayret edeceğim. Zaman zaman konu dışı paylaşımlar da yapma hevesim var, bu off topic paylaşımları başka bir günlük altına taşımak hevesimde.. Neyse şimdilik fazla hayal kurmadan bir başlangıç verip gerisinin zamanla oluşmasını istiyorum :)


Sevgiler herkese...

,