Herkesin bildiği gibi kurabiyeler genellikle istemci bilgisayarda kullanıcı hakkında bilgi içeren text dosyalarıdır. Aşağıda verilen ekran görüntüsünde fark edeceğiniz gibi ziyaret edilen çok sayıda site istemci bilgisayarda Cookie hazırlamaktadır. Windows Vista’da kullanıcılara ait Cokies klasörü farklı bir yerdedir. Cookie dosyaları kolaylıkla okunabildiği için önemli bilgileri içermeleri önerilmiyor. Tarayıcı programına göre değişmekle birlikte Cookie dosyaları en fazla 4 KB boyutuında olabilmektedir.

Bu ekran görüntüsünü dikkatlice incelerseniz bazı kurabiye dosyalarının adında 1, bazıların adında ise 2 ekinin olduğunu fark ederseniz. Ayrıca kurabiye dosyalarının adının @’ten öncesi geçerli kullanıcının adı iken @’ten sonra kurabiye dosyasını hazırlayan sitenin adıdır. Bu bölümü yazarken kullandığım bilgisayarda kullanıcı adı “memik” ve siteyi localhost olarak test ettiğim için hazırlanacak kurabiye dosyasının adı memik@loocalhost.txt olur. Hemen hatırlatmak gerekir ki kullanıcı Browser programından yararlanıp bilgisayarına Cookie dosyalarının yazılmasını engellemiş olabilir.
Geliştirdiğiniz Web siteniz dahilinde Cookie dosyası hazırlayıp istemci bilgisayara kullanıcıyla ilgili bilgiler aktarmak istiyorsanız System.Web’deki HttpCookie sınıfından yararlanmaniz gerekir. Bu sınıfın örneğinin nasıl alındığını aşağıda görebilirsiniz.
ProtectedSub Page_Load(ByVal sender As Object, ByVale As EventArgs) Handles Me.Load
Dim kurabiye_nesne As HttpCookie
kurabiye_nesne = New HttpCookie("ilk_kurabiye")
EndSub
Bu kodda HttpCookie sınıfının tek parametreli yapıcı metodunu kullandım. Bu sınıfın 2 parametreli yapıcı metodunun nasıl kullanıldığı hakkında bilgi konunun devamında verilecektir. Yapıcı metoda parametre olarak verilen string bilgi istemci bilgisayarda hazırlanacak dosyanın içine yazılmakta ve daha sonra bu dosyadan okuma yapılırken bu parametreden yararlanılmaktadır. Başka bir anlatımla buradaki “ilk_kurabiye” Cookie dosyasında hazırlanacak Cookie’nin adıdır.
Bu şekilde HttpCookie nesnesi hazırladıktan sonra sırada istemci bilgisayarın diskine yazılmak üzere bu nesneye bilgi aktarmak var. HttpCookie nesnesinde anahtar-değer şeklinde düzenlenmiş bilgiler Values koleksiyonunda saklanmaktadır. Bu koleksiyona eleman ekleme işlemini aşağıdaki gibi yapmak mümkündür.
ProtectedSub Page_Load(ByVal sender As Object, ByVale As EventArgs) Handles Me.Load
Dim kurabiye_nesne As HttpCookie
kurabiye_nesne = New HttpCookie("ilk_kurabiye")
kurabiye_nesne.Values("01") = "Adana"
kurabiye_nesne.Values("02") = "Adıyaman"
EndSub
HttpCookie sınıfının Values koleksiyonu indekslendiği için bu koleksiyona eleman ekleme işlemini aşağıdaki gibi yapmak mümkündür. Başka bir deyişle istemci bilgisayara yazılacak bilgileri HttpCookie nesnesine eklerken koleksiyon adı belirtmek şart değildir.
ProtectedSub Page_Load(ByVal sender As Object, ByVale As EventArgs) Handles Me.Load
Dim kurabiye_nesne As HttpCookie
kurabiye_nesne = New HttpCookie("ilk_kurabiye")
kurabiye_nesne("01") = "Adana"
kurabiye_nesne("02") = "Adıyaman"
EndSub
Konunun iyice anlaşılması için önce ayrı bir koleksiyon nesnesi hazırlayıp bu nesneye anahtar-değer şeklinde düzenlenmiş bilgileri ekleyip sonra bu koleksiyon nesnesini HttpCookie nesnesinin Values özelliğine aktaracağım. Bu işlemi nasıl yaptığımı aşağıda görebilirsiniz.Values koleksiyonu gerçekte NameValueCollection tipinde bir nesne olduğu için NameValueCollection sınıfının örneğini alıp Add() metodu ile anahtar-değer şeklinde düzenlenmiş bilgileri bu koleksiyon nesnesine ekledim.
ProtectedSub Page_Load(ByVal sender As Object, ByVale As EventArgs) Handles Me.Load
Dim kurabiye_nesne As HttpCookie
kurabiye_nesne = New HttpCookie("ilk_kurabiye")
Dim iller As New System.Collections.Specialized.NameValueCollection()
iller.Add("01", "Adana")
iller.Add("02", "Adıyaman")
kurabiye_nesne.Values.Add(iller)
EndSub
Bu şekilde HttpCookie nesnesinde saklanacak bilgiler tespit edildikten sonra sıra istemcinin bilgisayarında Cookie bilgisini içeren dosyanın ne kadar süre saklanacağını tespit etmeye gelir. Bu işlem için HttpCookie nesnesinin Expries özelliği aşağıdaki gibi ayarlanabilir. HttpCookie nesnesinin Expires özelliği ayarlanmazsa Cookie hazırlanır ama istemci bilgisayara kaydedilmez ve kullanıcı browser penceresini kapattığında bu Cookie silinir.
ProtectedSub Page_Load(ByVal sender As Object, ByVale As EventArgs) Handles Me.Load
Dim kurabiye_nesne As HttpCookie
kurabiye_nesne = New HttpCookie("ilk_kurabiye")
Dim iller As New System.Collections.Specialized.NameValueCollection()
iller.Add("01", "Adana")
iller.Add("02", "Adıyaman")
kurabiye_nesne.Values.Add(iller)
Dim silme_zamani As DateTime = Now.AddDays(15)
kurabiye_nesne.Expires = silme_zamani
EndSub
HttpCookie nesnesinin Exprires özelliğini ayarlamak üzere tanımladığım değişkene silme_zamani adı verirken tereddüt etmedim değil; zira silme_zamani’nı değişken adı olarak kullanma hakkı(!) programcılık kitapları yazan yerli bir yazara çok önceden geçmiş olabilir.
Bu ayarlama sayesinde Cookie bilgileri istemcinin bilgisayarında 15 gün boyunca saklanır. Başka bir deyişle Expires özelliği 15 gün sonraki tarih olan bu sitenin hazırladığı Cookie bu site 15 gün boyunca ziyaret edilmezse Cookie dosyası siliniyor. Expires özelliği DateTime tipinde olduğu için burada yapıldığı gibi geçerli tarihe AddDays() metodu ile gün eklemek yerine sahip bir tarihi bu özelliğe aktarabilirsiniz.
Şimdi sırada bu HttpCookie nesnesini istemcinin bilgisayarına yazmak var. Bu işlem için HttpResponse sınıfının yani Page sınıfının bir özelliği durumunda olan Responce nesnesinin Cookies koleksiyonuna hazırladığınız HttpCookie nesnesini Add() metodu ile eklemek gerekmektedir. Bu metodun nasıl kullanıldığını, başka bir deyişle istemcide nasıl Cookie dosyası hazırlandığını aşağıda görebilirsiniz.
ProtectedSub Page_Load(ByVal sender As Object, ByVale As EventArgs) Handles Me.Load
Dim kurabiye_nesne As HttpCookie
kurabiye_nesne = New HttpCookie("ilk_kurabiye")
Dim iller As New System.Collections.Specialized.NameValueCollection()
iller.Add("01", "Adana")
iller.Add("02", "Adıyaman")
kurabiye_nesne.Values.Add(iller)
Dim silme_zamani As DateTime = Now.AddDays(15)
kurabiye_nesne.Expires = silme_zamani
Response.Cookies.Add(kurabiye_nesne)
EndSub
Tam bu noktada istemcinin bilgisayarına geçerli kullanıcıya ait Cookies klasöründe text dosya hazırlamak için bütün hazırlıkları tamamlamış olduk. Aşağıda verilen ekran görüntüsünü sayfayı açıp bu kodun işletilmesini sağladıktan sonra aldım.

Yukarıda da işaret edildiği gibi Cookie dosyaları text dosyaları oldukları için kolaylıkla okunabilir. Bu nedenle önemli bilgilerin Cookie dosyalarına yazılması önerilmiyor. Hazırladığım bu Cookie dosyasının içeriğini aşağıda görebilirsiniz.

Yukarıda işaret edildiği gibi hazırladığım kod sayesinde istemcinin bilgisayarında oluşturulan text dosyasının adına “1” eklendi. Bu 1’in anlamı şudur: Bu cookie dosyasında bir HttpCookie nesnesine ait bilgiler bulunmaktadır. Başka bir deyişle buradaki 1’in anlamı Response nesnesinin Cookies koleksiyonuna Add() metodu ile bir HttpCookie nesnesinin eklenmiş olmasıdır. Bir Cookie dosyasında birden fazla HttpCookie nesnesinin içeriğinin yazılabildiğini göstermek için yukarıda verdiğim kodu ekleme yaptım.
ProtectedSub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
Dim kurabiye_nesne As HttpCookie
kurabiye_nesne = New HttpCookie("ilk_kurabiye")
Dim iller As New System.Collections.Specialized.NameValueCollection()
iller.Add("01", "Adana")
iller.Add("02", "Adıyaman")
kurabiye_nesne.Values.Add(iller)
Dim silme_zamani As DateTime = Now.AddDays(15)
kurabiye_nesne.Expires = silme_zamani
Response.Cookies.Add(kurabiye_nesne)
Dim takimlar_cookie As HttpCookie
takimlar_cookie = New HttpCookie("ikinci_kurabiye")
Dimtakimlar As New System.Collections.Specialized.NameValueCollection()
takimlar.Add("FB", "Fenerbahçe")
takimlar.Add("GS", "Galatasaray")
takimlar.Add("BJK", "Beşiktaş")
takimlar_cookie.Values.Add(takimlar)
Dim expire_zamani As DateTime = Now.AddDays(30)
takimlar_cookie.Expires = expire_zamani
Response.Cookies.Add(takimlar_cookie)
EndSub
Bu kod işletildiğinde hazırlanacak Cookie dosyasının adına “2” eklenir ve 2 HttpCookie nesnesinin Values koleksiyonun içeriğine sahip olur.
Cookie Dosyasından Okuma Yapmak
Ne zaman Cookie içeren text dosyasından okuma yapmak istediğinizde yine HttpCookie nesnesi hazırlamanız gerekir. İstemcinin bilgisayarındaki text dosyasından nasıl okuma yapıldığını anlatmak için sayfaya 2 Listbox yerleştirip aşağıda verdiğim kodu yazdım.
ProtectedSub Oku_Click(ByVal sender As Object, ByVale As System.EventArgs) Handles Oku.Click
Dim okuma_kurabiye As HttpCookie
okuma_kurabiye = Request.Cookies("ilk_kurabiye")
EndSub
Bu kod sayesinde istemcinin bilgisayarındaki Cookie dosyasının içeriğinin “ilk_kurabiye” ile ilgili elemanı Request nesnesinin Cookies koleksiyonundan okunup hazırlamış olduğumuz HttpCookie nesnesine aktarılır. Şimdi sırada bu HttpCookie nesnesindeki anahtar-değer şeklinde düzenlenmiş bilgileri okumak var. Bu amaçla bu koda aşağıdaki gibi ekleme yaptım.
Aşağıda verdiğim kodda kullandığım “deger” adlı değişken 2004 yılında ilk C# kitabımı yazarken adını çaldığım(!) önemli değişkenlerden birisidir. Yani anahtar-değer şeklinde düzenlenmiş bilginin değer kısmına “deger” adını vermekle aslında suç işlemiş(!) oluyorum. Umarım okurlarını zirvelere çıkarmayı kendisine şiar edinmiş ünlü programcılık kitabı yazarımız bu metni okumaz veya kimse “Memik Yanık senin gül değişkeninin adını makalesinde kullanmış ama sen hala burada oturuyorsun” diye ihbarda bulunmaz.
ProtectedSub Oku_Click(ByVal sender As Object, ByVale As EventArgs) Handles Oku.Click
Dim okuma_kurabiye As HttpCookie
okuma_kurabiye = Request.Cookies("ilk_kurabiye")
Dim deger As String
deger = okuma_kurabiye("01")
ListBox1.Items.Add("01")
ListBox2.Items.Add(deger)
EndSub
Bu kod sayesinde anahtar bilgisi “01” olan elemanın değer bilgisi okunup ikinci ListBox’a aktarılır. Burada okuma işlemi gerçekte(aslında aynı zamanda) HttpCookie nesnesinin Items koleksiyonundan yapıldığı için daha doğrusu HttpCookie sınıfının Items koleksiyonu da indekslendiği için bu kod aşağıdaki gibi düzenlenirse aynı sonuç alınır.
ProtectedSub Oku_Click(ByVal sender As Object, ByVale As System.EventArgs) Handles Oku.Click
Dim okuma_kurabiye As HttpCookie
okuma_kurabiye = Request.Cookies("ilk_kurabiye")
Dim deger As String
deger = okuma_kurabiye.Item("01")
ListBox1.Items.Add("01")
ListBox2.Items.Add(deger)
EndSub
HttpCookie sınıfının Items koleksiyonu biraz da geriye doğru uyumluluğu sağlamak için vardır. Bu nedenle Items yerine Values koleksiyonunu kullanmanız önerilir. Konu üzerinde düşünmenizi sağlamak için aşağıda verdiğim kodu yazdım. Bu kod sayesinde ilk_kurabiye adını verdiğim HttpCookie nesnesinin bütün elemanları okunur ve anahtarları ilk ListBox’a değerleri ise ikinci ListBox’a yazılır. Alışkanlıklarımdan bir türlü vazgeçemiyorum ve aşağıda verdiğim kodda kullanım hakkı yerli bir yazarda olan ve değişken adı olarak kullanılması suç teşkil eden “i” ve sayi’yı değişken adı olarak kullanmışım.
ProtectedSub Oku_Click(ByVal sender As Object, ByVale As EventArgs) Handles Oku.Click
Dim okuma_kurabiye As HttpCookie
okuma_kurabiye = Request.Cookies("ilk_kurabiye")
Dim iller As New System.Collections.Specialized.NameValueCollection()
iller = okuma_kurabiye.Values
Dim sayi As Integer = iller.Count
For i As Integer = 0 To sayi - 1
Dim anahtar, deger As String
anahtar = iller.Item(i)
deger = iller.Keys(i)
ListBox1.Items.Add(anahtar)
ListBox2.Items.Add(deger)
Next
EndSub
Yukarıda işaret edildiği üzere HttpCookie sınıfının Values özelliği gerçekte NameValueCollection tipindedir. Bu nedenle önce NameValueCollection tipinde bir nesne hazırladım sonra okuma yapmak üzere hazırladığım HttpCookie nesnesinin Values özelliğini bu nesneye aktardım.
Okuma yapmak istediğiniz Cookie’nin varlığını araştırmak istiyorsanız aşağıdaki gibi kod yazabilirsiniz. Burada yapılan Request nesnesinin Cookies koleksiyonda ilgilenilen elemanın yani Cookie’nin olup olmadığını araştırmaktır.
ProtectedSub Oku_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Oku.Click
If Request.Cookies("ilk_kurabiye") IsNot Nothing Then
Response.Write("Bu Cookie istemcide vardır")
Else
Response.Write("Bu Cookie istemcide yoktur")
End If
EndSub
Benzer şekilde Cookie dosyasındaki ikinci grup bilgi içinde HttpCookie nesnesi hazırlanıp okuma yapılabilir. Başka bir deyişle aşağıdaki gibi bir HttpCookienesnesi hazırlanıp bu nesne sayesinde Cookie dosyasındaki ikinci grup bilgileri okumak mümkündür.
HttpCookie Sınıfının 2 Parametreli Yapıcı Metodu
Cookie’ler ve HttpCookie sınıfıyla ilgili olarak ilk yaptığımız işlemde HttpCookie sınıfının bir parametreli yapıcı metodunu kullanıp aşağıdaki gibi HttpCookie nesnesi hazırlamıştık. Ayırca bu sınıfın 2 parametreli yapıcı metodundan daha sonra söz edeceğimizi işaret etmiştik.
Dimkurabiye_nesne As HttpCookie
kurabiye_nesne = New HttpCookie("ilk_kurabiye")
Şimdi ise HttpCookie sınıfının 2 parametreli yapıcı metodundan yararlanıp HttpCookie nesnesi hazırlayacağım. İkinci parametre tıpkı 1. parametre gibi string tipindedir.
ProtectedSub Page_Load(ByVal sender As Object, ByVale As EventArgs) Handles Me.Load
Dim kurabiye As HttpCookie
kurabiye = New HttpCookie("Takim", "Fenerbahçe")
Dim expire_zamani As DateTime = Now.AddDays(30)
kurabiye.Expires = expire_zamani
Response.Cookies.Add(kurabiye)
EndSub
Bu kod işletildiğinde istemci bilgisayarda yine bir Cookie dosyası hazırlanır bu dosyada "takim" adında bir Cookie ve anahtar-değer olarak yalnızca “Fenerbahçe” bilgisi yazılır. Başka bir deyişle Request nesnesinin Cookies koleksiyonunda bu elemanın bir adı olmaz. Bunu text dosyayı inceleyerek görebilirsiniz.
Şimdi bu dosyadaki anahtar-değer çiftini okuyacağım. Bu amaçla aşağıda verdiğim kodu yazdım. Bu amaçla HttpCookie tipinde değişken tanımlayıp Request nesnesinin Cookies koleksiyonun ilk elemanını bu değişkene aktardım.
ProtectedSub oku_Click(ByVal sender As Object, ByVale As EventArgs) Handles oku.Click
Dim kurabiye_nesne As HttpCookie
kurabiye_nesne = Request.Cookies(0)
ListBox1.Items.Add(kurabiye_nesne.Name)
ListBox2.Items.Add(kurabiye_nesne.Value)
EndSub
* Meraklısı İçin Notlar
Her ne kadar bu makalede Cookie'ler her yönü ile anlatılmamış olunsa bile bu makaleyi okuyanların Türkiye'de yayınlanmış ASP.NET konulu kitaplardan Cookie'ler hakkında ek birşeyler bulma ihtimalleri çok düşüktür. Çünkü kitaplarda bu kadar bilgi bile yoktur.
--------------------------------------------------------
Visual Basic 9.0 Kitabı
Daha kapsamlısı yoktur,
Daha kolay okunanı yoktur,
Bu kadar ileri düzey bilgi içeren başka bir Visual Basic kitabı yoktur.

.NET uyumlu Visual Basic programlama dilini öğrenmek, eksik bilgilerinizi tamamlayıp Visual Basic uzmanı olmak isteyenler için dünyanın en iyi kitaplarından birisi Memik YANIK tarafından Türkçe olarak hazırlandı. Kitaptan alınıp aşağıda linki verilen bölümü incelediğinizde bize hak vereceksiniz.
http://www.memikyanik.net/application-sinifi-ve-visual-basic-projeleri-makalesi/30.aspx
Peşinen söyleyelim bu kitapla ilgilenenlere fikir versin diye web’de yayınlanan bu bölümde verilen bilgileri yerli kaynakların hiç birinde, yabancı kaynakların büyük bir çoğunluğunda bulamazsınız. Kitap hakkında ayrıntılı bilgiyi aşağıda linki verilen makalede bulabilirsiniz.
http://www.memikyanik.net/visuan-basic-90-kitabim-hakkinda-yazisi/29.aspx
Bu kitabı edinmek istiyorsanız aşağıda verilen adresten temin edebilirsiniz.
http://www.hepsiburada.com/visual-studio-2008-ile-microsoft-visual-basic-9.0/productDetails.aspx?categoryid=211651&productid=kseckin0001