Makale Özeti

Bu makalede ASP.NET projelerinde global.asax dosyasının hangi amaçlar için etkin bir şekilde kullanılabileceğini aktarmaya çalışacağım.

Makale

Visual Studio .NET ile yeni bir proje yarattığınızda iki özel dosya da yaratılmaktadır. Bunlardan biri web.config diğersi ise global.asax dosyasıdır. Bu makalade global.asax dosyası içerisinde yer alan kısımlardan bir kısmına değinerek projelerinizde hangi kısımlarda kullanabileceğinizi inceliyor olacağız.

Güvenlik İçin Global.asax

Öncelikle global.asax dosyası sadece server üzerindeki uygulama içerisinde çalışan bir dosyadır, bunun anlamı dosya dışarıdan çağırıldığında istemciye asla görüntülenmeyecektir. Böylelikle güvenli bir şekilde bu dosyayı kullanabiliriz. Bir ek bilgi olarak aynı şekilde web.config dosyası da dışarıdan gelecek isteklere yanıt vermemektedir. Bunu örnekleyecek olursak; örneğin bir SQL Bağlantı cümlesini her sayfada ayrı ayrı yaratıp kullanmak yerine, bu iki dosyadan birinde yaratıp, içeriğini de registry içirisinde şifrelenmiş olarak tuttuğunuz bağlantı stringinden alabilirsiniz. Böylece güvenli uygulamalar noktasında ciddi bir adım atmış olacaksınız.

ASPdeki Global.asadan Farkı

Global.asax dosyası ASP ile uygulama geliştirmiş kişilere yabancı gelmemektedir, çünkü ASP 3.0da da global.asa diye bir dosya vardı, ama sadece 4 olay ile ilgili işlem yapabiliyordunuz; SessionOnStart, SessionOnEnd, ApplicationOnStart, ApplicationOnEnd. Oysa ASP.NETde yer alan global.asax dosyasında 16 farklı olay için kod yazabildiğiniz gibi ASP.NET 2.0 içerisinde bu sayı da artacaktır.

Hemen bir örnek uygulama ile başlayalım; çok klasik olsa da bize Application ve Session konusunu iyi anlattığı için bu örneği yapacağım: "Sitede aktif kaç kişi var". Bunu nasıl bulabiliriz diye düşündüğümüzde, eğer siteye giriş yapan her kullanıcı için oturum bazında değişken olan Application değişkeninin değerini bir arttırır, siteden biri çıkış yaptığında bir azaltırsam bu Application değeri her zaman bana sitede kaç kişinin bulunduğunu verecektir. Nasıl yapıldığına kısa bir göz atalım:

Global.asax Dosyası:

Sub Application_Start(ByVal Sender As Object, ByVal e As EventArgs)
  Application("totalusercount") = 0
End Sub

Sub Session_Start(ByVal Sender As Object, ByVal e As EventArgs)
  Dim CurrentUserCount As Integer
  Dim NewUserCount As Integer
  CurrentUserCount = CInt(Application("TotalUserCount"))
  NewUserCount = (CurrentUserCount + 1)
  Application("TotalUserCount") = NewUserCount
End Sub

Sub Session_End(ByVal Sender As Object, ByVal e As EventArgs)
  Dim CurrentUserCount As Integer
  Dim NewUserCount As Integer
  CurrentUserCount = CInt(Application("TotalUserCount"))
  NewUserCount = (CurrentUserCount - 1)
  Application("TotalUserCount") = NewUserCount
End Sub

Örnek kodda da görüldüğü gibi Application_Start olayında sitedeki toplam kullanıcı sayısını tutacak olan değişken olan totalusercount değişkeni 0 olarak belirlenmiştir. Ardından her yeni oturum açıldığında yani Session_Start anında toplam sayı bir arttırılmış, her oturum kapanışında yani Session_End anında toplam sayu bir eksiltilmiştir. Böylelikle site için yazacağım aşağıdaki gibi bir kod her zaman bana sitedeki aktif kullanıcıların sayısını verecektir:

aktif_kullanicilar.aspx

<strong>Sitedeki aktif kullanıcılar:&nbsp;&nbsp;</strong>
<asp:Label id="aktif_sayi" runat="server" font-bold="True" forecolor="Blue">
<p><asp:Button id="cmd_Abandon" runat="server" Text="Abandon"></asp:Button></p>
</asp:Label>

Bu ASP.NET sayfasının arka planındaki kodda ise şunu yazmamız yeterli olacaktır:

aktif_kullanicilar.aspx.vb

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  aktif_sayi.Text = Application("TotalUserCount").ToString()
End Sub

Görüldüğü gibi aktif_sayi adlı Label sunucu kontrolüne arka plandaki koddan sitede kaç kişinin olduğu bilgisini atadım. Örnek ekran görüntüsüne bakacak olursak:

Şekil 1

Görüldüğü gibi sitedeki aktif kullanıcı sadece ben olduğum için 1 sonucunu elde ettim. Bu sayfadan daha fazla sayıda açarsanız açtığınız sayı kadar sayının arttığını göreceksiniz. Şimdi ilginç bir şey dikkatinizi çekti mi? Nerden çıktı bu "© Mehmet Nuri Çankaya" ifadesi. İşte yeni bir özellikle daha karşı karşıyayız. Global.asax dosyamızda bulunan şu satır bize bunu sağladı:

Global.asax Dosyası:

Sub Application_EndRequest(ByVal Sender As Object, ByVal e As EventArgs)
  Response().Write("&copy; Mehmet Nuri ÇANKAYA")
End Sub

Koddan da anlaşıldığı gibi sunucu tüm sayfaları ürettikten sonra hepsinin sonuna bir de Application_EndRequest kısmında bir ifade yazıldıysa bunu ekliyor. Böylelikle sitede standart olarak göstermek istediğiniz metinleri bu yöntemle ekleyebilirsiniz.

Hata Oluştuğunda Event Loga Kayıt Etmek

Site içerisinde bir hata oluştuğunda bu hatadan haberdar olmak istiyorsunuz, böylece hatayı çözebilesiniz. Peki ama bunu nasıl yapacaksınız? Bunu yapmanın birçok yolu var, örneğin siteden sorumlu bir kişiye email gitmesini sağlayabilirsiniz veya bir veritabanı tablosuna kayıt ekleyebilirsiniz. Fakat tüm bunlardan önce zaten bu işler için yaratılmış olan ve kullanılan bir kısım var "Event Log"; buraya yazmaya ne dersiniz? Hadi hemen koda bakalım:

Global.asax Dosyası:

Sub Application_Error(ByVal Sender As Object, ByVal e As EventArgs)
  Hata Hakkında Bilgi Alınıyor
  Dim PageUrl As String = Request.Path
  Dim ErrorInfo As Exception = Server.GetLastError()
  Dim m As String
  m = "Şu sayfaya erişirken hata oluştu: " & PageUrl
  m = m & " hata kodu: " & ErrorInfo.InnerException.Message.ToString()

  Yeni bir EventLog yaratılıyor ASP_NET_LOG adında varsa referans veriliypr
  Dim ev As New EventLog("ASP_NET_LOG")

  hatayı event loga yazıyoruz
  ev.Log = "ASP_NET_LOG"
  ev.Source = "ASP_NET"
  ev.WriteEntry(m, EventLogEntryType.Error, 5000)

  Kullanıcıyı düzgün bir hata mesajı verdiğimiz sayfaya yönlendiriyoruz
  Response.Redirect("CustomError.aspx")
End Sub

Metin Dosyalarına Bilgi Yazmak

Peki ya örneğin bir kullanıcı çıkış yaptığında bunu sizin de görebileceğiniz bir metin dosyası içerisine yazmak isterseniz? Artık cevap tanıdık geliyor, bu işlemi de global.asaxde yapmalıyız. Nasıl mı? İşte global.asax kodu:

Global.asax Dosyası:

Sub Session_End(ByVal Sender As Object, ByVal e As EventArgs)
  Dim fs As New FileStream("c:\kullanici_cikislari.txt", FileMode.Append,   FileAccess.Write)
  Dim LogStream As New StreamWriter(fs)
  Dim s As String
  Dim UserID As String
  UserID = Session("UserID").ToString()
  s = "Kullanıcı: " & UserID
  s = s & " çıkış yaptığı tarih " & DateTime.Now
  LogStream.WriteLine(s)
  LogStream.WriteLine("")
  LogStream.Close()
  fs.Close()

End Sub

Session_End yani kullanıcı oturumu kapattığı anda çalışacak olan kod sayesinde sabit disk üzerinde kullanici_cikislari.txt adında bir dosya yaratılır, varsa içerisine bilgi eklenecek şekilde açılır ve kullanıcı adı çıkış zamanı ile birlikte s stringi olarak eklenir. Açtığımız dosyayı da son satırda kapatmayı asla unutmuyoruz, yoksa bir diğer kullanıcı için hata verecektir.

Özetle:

Özet olarak global.asax dosyasında birçok olayı kontrol etmek ve sunucu taraflı kodlar yazmak mümkün. Bu kodlar bana uygulama dağıtımı açısından avantajlar sağladığı gibi aynı zamanda kolay yönetilebilen bir uygulama mimarisi sağlamaktadır. Farklı güvenlik önlemleri ve performans artışlarını global.asax dosyası ile uygulamak çok kolay yapılabilmektedir.

Bilgiyi paylaştığımız yeni bir yazıda daha görüşmek dileklerimle.

Mehmet Nuri ÇANKAYA

cankaya@aspnedir.com