C#nedir?com
 
YAZAR HAKKINDA
Burak Selim Şenyurt
Burak Selim Şenyurt
http://www.buraksenyurt.com
İletişme geçmek için tıklayın.
303 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: bogumu cookie farkli isimli isimsiz kullanici kullanicilar kullanicinin profile sisteme siteye string vardir. varsayilan web.config ASP.NET Burak Selim Şenyurt
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Orta
Kategori : ASP.NET
Yayınlanma Tarihi : 6/2/2006
Okunma Sayısı : 12556
Yorum Sayısı : 3     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Tufan Ünlü
iTextSharp kütüphanesi kullanarak pdf dosyası oluşturmak
Tufan Ünlü
yazının devamı >
Görkem Sezgin
Oracle'de Otomatik Artan İçerikli Sütun Oluşturmak
Görkem Sezgin
yazının devamı >
Turhal Temizer
SharePoint 2010 - SPD 2010 ile Server–Side Kod Yazmak
Turhal Temizer
yazının devamı >
Turhal Temizer
SharePoint 2010–Veri Tabani Loglama (Logging Database)
Turhal Temizer
yazının devamı >
Selman UZUN
X86 Assembly Diliyle Buble Sort
Selman UZUN
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer 'in Blogu
SharePoint 2010 - Error occurred in deployment step ‘Recycle IIS Application Pool’ 9/2/2010
Turhal Temizer 'in Blogu
SharePoint 2010 – Custom MasterPage ile Yönetilebilir Kod Kullanımı 9/2/2010
Burak Selim Senyurt(MVP)
NedirTv?com Söyleşileri – 2 – Takım Çalışması 8/27/2010
Burak Selim Senyurt(MVP)
Entity Framework, Data Services, C# 4.0, Excel ve Komple Bir Uygulama 8/26/2010
Tembel Yazılımcı'nın Seyir Defteri
Test Driven Development ve Unit Testing 7/8/2010
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Her Yönüyle C# - Sefer Algan
Asp.Net 2.0 Profile API ile Personalization (Kişiselleştirme)
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
Günümüz web uygulamalarında, kullanıcı bazlı kişiselleştirme (personalization) oldukça önemli ve popüler bir konudur. Örneğin, bir elektronik ticaret sitesini ziyaret ettiğimizi düşünelim. Bu site bir sonraki ziyaretimizde, daha önceden bakmış olduğumuz ürünler ile ilişkili yeni önerilerde bulunabilir. Böylece siteye giren kullanıcıları başka ürünlere yönlendirebilir. Yeni önerilerin sunulabilmesi, sitenin bizim alışkanlıkarımızı takip etmesi ve kendisini buna göre değiştirmesi anlamına gelmektedir. Daha açık bir şekilde söylemek gerekirse bu site, üyelerin özelliklerine göre kişiselleşmektedir. Buna örnek olabilecek en güzel sitelerden birisi amazon.com’ dur. Bir sitenin, üyelerinin isteklerine göre davranış göstermesi için kullanılan çeşitli teknikler vardır. Bunlardan belkide en basiti ve ilkel olanı Cookie kullanımıdır. Cookie’ ler istemci taraflı bilgi saklama amacıyla tercih edilirler. Ancak istemcilerin Cookie desteği olmadığı durumlarda kişiselleştirme (personalization) mümkün olmayacaktır. Alternatif ve daha sağlıklı bir yol olarak kullanıcıya ilişkin bilgilerin kişiselleştirme (personalization) amacıyla veritabanı sistemlerinde tutulması ve sayfalar arası geçişlerde de Session nesneleri yardımıyla taşınması çok daha profesyonel bir yaklaşımdır.

Asp.Net 2.0, getirdiği MemberShip Management (Üyelik Yönetimi) sistemi içerisine kişiselleştirme (personalization) ile ilişkili bir takım yenilikler eklemiştir. Bunlardan belkide en önemlisi Profile API’ dir. Diğer kişiselleştirme (personalization) şekli ise Web Part kullanımıdır. Profile API yardımıyla, kullanıcı bazlı kişiselleştirilmiş ayarlar MemberShip sistemine dahil edilip kullanılabilir. Böylece siteye giren her üye için farklı kişisel bilgiler tutulabilir ve sayfanını o kullanıcıya has olacak şekilde değiştirilmesi dinamik olarak sağlanabilir. Elbette kullanıcı için geçerli olan bu kişisel ayarlar üyelik sistemine ait tablolarda saklanmalıdır. Aksi halde siteye giren kullanıcı ile kişiselleştirilmiş verilerin entegrasyonu çok zor olacaktır.

Profile sisteminde veritabanı tarafında Sql Server 7, 2000 ve 2005 sistemleri kullanılabileceği gibi, Custom Provider’ lar yardımıyla farklı depolama ortamlarıda ele alınabilir. Profile API üye bazlı verileri sunucu üzerinde tutmaktadır. Biz bu makalemizde Profile API’ sini kullanarak basit olarak kişiselleştirme (personalization) işlemlerinin nasıl yapılabileceğini incelemeye çalışacağız. Profile API’ sini kullanırken, kişiselleştirilecek bilgiler birer özellik olarak Web.Config dosyasına eklenirler. Asp.Net 2.0 ’ da Web.Config dosyasına eklenen yeni boğumlardan birisi olan Profile boğumu sayesinde o site için geçerli tüm kullanıcılara ait ortak profil deseneleri oluşturulabilir. Profile boğumu içerisinde herhangibir bir üye için kişsel ayarların tutulabileceği özellik tanımlamaları yer alır. Bu özellikler içinde Properties boğumundan faydalanılır. Aşağıdaki örnekte Web.config dosyası içerisine dahil edilmiş örnek Profile özelliklerini görebilirsiniz.

<system.web>
    <profile>
        <properties>
            <add name="Kategorim"/>
            <add name="KarsilamaMesajim"/>
            <add name="SonGirisZamanim"/>
        </properties>
    </profile>
Bu profile bilgisine göre, sisteme giriş yapan her kullanıcı için Kategorim, KarsilamaMesajim ve SonGirisZamanim isimli özelliklerde kişiye göre farklı değerler tutulabilecektir. Profile içerisinde belirtilen özelliklerin kullanılabilmesi için en azından sitenin kullanıcı bazlı çalışacak şekilde organize edilmesi gerekir. Bu makale için geliştirdiğimiz örnekte, Sql Server 2005 Express Edition’ ı kullanan MemberShip sistemi çalışmaktadır. Böylece, her bir kullanıcıya özel profil değerlerini saklayabiliriz. Bu değerler varsayılan olarak aspnet_Profile tablosunda saklanmaktadır. Profile için tutulacak özellikleri konfigurasyon dosyasına ekledikten sonra kod içerisinde Profile sınıfını kullanarak çeşitli işlemleri gerçekleştirebiliriz. Web.Config dosyasında, Profile boğumu içerisindeki Properties boğumu altına eklenen her bir elemana Profile sınıfı üzerinden erişebiliriz.



Şekildende görebileceğiniz gibi, kod tarafında Profile sınıfı ve intelli-sense yardımıyla, özellik olarak eklediğimiz tüm elemanlara ulaşabilmekteyiz. Şimdi basit olarak bu sınıfı nasıl kullanacağımıza bir bakalım. Örnek senaryo olarak default.aspx sayfamızı aşağıdaki gibi tasarlayalım.



Öncelikli olarak sayfamızın çalışma şeklinden kısaca bahsedelim. Uygulamamızda Form tabanlı doğurlama kullandığımız için, default.aspx sayfasına gelinmeden önce isimsiz kullanıcılar UserLogin.aspx sayfasına bir kere uğramak zorundalar. Burada sisteme başarılı bir şekilde Login olan kullanıcılar default.aspx sayfasına geldiklerinde güncel profillerine ait özelliklere erişebilecek ve değiştirebilecekler. Böylece Web.Config dosyasındaProfile boğumu içerisinde belirttiğimiz özelliklerin her birinin değerlerini her kullanıcı için farklı şekillerde tutabileceğiz. Yani kişiye göre özelleştirme yapmış olacağız. Bunları gerçekleştirebilmek için kodumuzda aşağıdaki değişiklikleri yapalım.

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (User.Identity.IsAuthenticated)
        {
            ProfileBilgisi();
        }
    }

    private void ProfileBilgisi()
    {
        lblKategorim.Text = Profile.Kategorim;
        lblMesajim.Text = Profile.KarsilamaMesajim;
        lblSonGirisZamanim.Text = Profile.SonGirisZamanim;
    }
    protected void btnSaveProfile_Click(object sender, EventArgs e)
    {
        Profile.SonGirisZamanim = DateTime.Now.ToString();
        Profile.KarsilamaMesajim = txtMesaj.Text;
        Profile.Kategorim = ddlKategoriler.SelectedItem.Text;
        Profile.Save();
        ProfileBilgisi();
    }
}
İlk olarak sayfa yüklenirken eğer kullanıcı sisteme giriş yapmış ise ona ait Profile özelliklerinin değerlerini alıyor ve ekrandaki label kontrollerine yazdırıyoruz. Button kontrolüne tıklandığında ise kullanıcının girdiği değerler, bu kullanıcıya özel profile bilgileri olarak veritabanındaki aspnet_profile tablosuna kaydediliyor.



Profile içerisinde tutulan özellik değerleri örnek Burak isimli kullanıcı için aspnet_Profile isimli tabloda aşağıdaki şekilde görüldüğü gibi tutulur.



Kullanıcıya ait Profile bilgisini oluşturan özellikler ile bunlara karşılık gelen değerlerin nasıl tutulduğuna dikkat ediniz. Profile içerisinde tanımladığımız tüm özellikler PropertyNames alanı içerisinde tutulur. Bu özellikere karşılık gelen değerler ise PropertyValueString alanı içerisinde tutulmaktadır. Burada 3 farklı kullanıcı için 3 farklı Profile satırı yer almaktadır. Profile içerisinde tanımlamış olduğumuz özellikler şu anda varsayılan olarak String tipindendirler. İstersek burada tutulacak özelliklerin tiplerinide açıkça söyleyebilir ve hatta varsayılan değerlerinide ayarlayabiliriz. Özellikte tip güvenliğini sağlamak açısından type niteliğini kullanmakta fayda vardır. Örneğimizdeki Profile bilgisini buna uygun olacak şekilde aşağıdaki gibi düzenlediğimizi düşünelim.

<profile>
    <properties>
        <add name="Kategorim" type="System.String" defaultValue="Dvd"/>
        <add name="KarsilamaMesajim" type="System.String" defaultValue="Kişisel Mesajınız"/>
        <add name="SonGirisZamanim" type="System.DateTime"/>
        <add name="ButonFontBuyuklugu" type="System.Int32" defaultValue="12"/>
    </properties>
</profile>
Burada dikkat ederseniz iki yeni özellike daha ekledik. Bununla birlikte her özelliğimiz için geçerli olabilecek primitive tipleri ve varsayılan değerleri tanımladık. Uygulamamızı bu haliyle derlediğimizde SonGirisZamanim özelliğinin kullanıldığı yerler için hata mesajları alırız.



Sebep son derece açıktır. SonGirisZamanim isimli Profile özelliğinin tipini DateTime olarak belirttiğimizden, bu özelliğin kullanıldığı yerlerde uygun tür dönüşümlerini yapmamız gerekmektedir. Bu değişiklikler ışığında kodumuzu yeniden aşağıdaki gibi düzenleyelim.

protected void Page_Load(object sender, EventArgs e)
{
    if (User.Identity.IsAuthenticated)
    {
        ProfileBilgisi();
    }
}

private void ProfileBilgisi()
{
    lblKategorim.Text = Profile.Kategorim;
    lblMesajim.Text = Profile.KarsilamaMesajim;
    lblSonGirisZamanim.Text = Profile.SonGirisZamanim.ToLongDateString();
    btnSaveProfile.Font.Size = Profile.ButonFontBuyuklugu;
}
protected void btnSaveProfile_Click(object sender, EventArgs e)
{
    Profile.SonGirisZamanim = DateTime.Now;
    Profile.KarsilamaMesajim = txtMesaj.Text;
    Profile.Kategorim = ddlKategoriler.SelectedItem.Text;
    Profile.Save();
    ProfileBilgisi();
}
Elbette primitive tipleri kullanabileceğimiz gibi, kendi yazmış olduğumuz tipleride kullanmak isteyebiliriz. Örnek olarak kullanıcının site içerisinde gezdiği sayfalara ilişkin bilgileri saklayabileceğimiz bir sınıfımız olduğunu düşünelim.



public class UrlInfo
{
    private string _sayfaAdi;
    public string SayfaAdi
    {
        get { return _sayfaAdi; }
        set { _sayfaAdi = value; }
    }
    private string _url;
    public string Url
    {
        get { return _url; }
        set { _url = value; }
    }
    private DateTime _sonGirisTarihi;
    public DateTime SonGirisTarihi
    {
        get { return _sonGirisTarihi; }
        set { _sonGirisTarihi = value; }
    }
    public UrlInfo()
    {    }
    public UrlInfo(string ad, string url, DateTime giris)
    {
        SayfaAdi = ad;
        Url = url;
        SonGirisTarihi = giris;
    }
}
Bu sınıfı Profile içerisinde bir özellik tipi olarak set etmek için aşağıdaki notasyonu kullanmamız gerekmektedir.

<add name="SonSayfa" type="UrlInfo"/>
Bu noktadan sonra SonSayfa isimli Profile özelliğini uygulamamız içerisinde istediğimiz şekilde kullanabiliriz. Özelliğin çalışacağı değer türü artık UrlInfo’ dur. Örneğin o anki kullanıcının Profile bilgisine yeni bir UrlInfo örneği eklemek için aşağıdaki kod satırına benzer bir ifade yazabiliriz.

Profile.SonSayfa = new UrlInfo("default", "default.aspx", DateTime.Now);
Diğer taraftan SonSayfa özelliğinin içeriğini okurken, geri dönecek olan değerin tipi UrlInfo olacağından, aşağıdaki kod parçasında olduğu gibi güncel kullanıcının geçerli olan UrlInfo üyelerine de erişebiliriz.

lblSonSayfa.Text = Profile.SonSayfa.SayfaAdi + " " + Profile.SonSayfa.SonGirisTarihi.ToShortDateString();
Yanlız burada dikkat edilmesi gereken bir nokta vardır. Şu anda SonSayfa özelliğinin aspnet_Profile içerisinde nasıl tutulduğuna bakarsak Xml şeklinde tutulduğunu görürüz.



Dilerseniz özelliğin içeriğini Binary formatında tutarak daha az yer tutmasınıda sağlayabilirsiniz. Bunun için Properties boğumunda ilgili özellik için serializeAs niteliğini kullanmamız gerekmektedir.

<add name="SonSayfa" type="UrlInfo" serializeAs="Binary"/>
Lakin uygulamamızı bu şekilde çalıştırdığımızda ve bir kullanıcı ile sisteme giriş yaptığımızda aşağıdaki istisna mesajını alırız.



Bunun sebebi ise, yazmış olduğumuz UrlInfo tipinin ikili formatta serileştirilebilir olarak işaretlenmemesidir. Serializable niteliğini (attribute) kullanarak bu hatanın önüne geçebilir ve tipimizi ikili formatta serileştirilerek ilgili alan içerisine alınmasını sağlayabiliriz.

[Serializable]
public class UrlInfo
{
...
Tipimizi serileştirilebilir olarak işaretledikten sonra uygulamamız sorunsuz bir şekilde çalışacaktır. Elbette UrlInfo tipinin güncel kullanıcı için geçerli olan içeriği artık tabloda, PropertyValuesString alanında değil, PropertyValueBinary alanında saklanacaktır.

Profile API’ si ile ilgili dikkat edilmesi gereken bir diğer hususda, siteye giren isimsiz kullanıcıların nasıl ele alınacağıdır. Siteye giren isimsiz kullanıcılar (anonymous users) içinde Profile bilgisi tanımlanabilir. Bazı alışveriş sitelerinde isimsiz kullanıcılar dahi sepete bir şeyler ekleyebilmektedir. Bu isimsiz kullanıcının bir sonraki girişinde daha önceden oluşturduğu sepeti kullanabilmeside kişiselleştirme ile alakalıdır. Aslında isimsiz bir kullanıcı sisteme girdiğinde onun için bir benzersiz bir id değeri üretilir. Bu id değeri varsayılan olarak oturum açan kullanıcının bilgisayarında cookie şeklinde saklanır. Elbette cookie desteği olmayan istemciler için aynı Session modelinde olduğu gibi cookieless çözümü vardır. Bu yöntemler sayesinde, bir siteye bağlanan her isimsiz kullanıcı için ayrı ayrı kişiselleştirmeler yapabiliriz. Başlamak için öncelikli olarak Web.Config idosyası çerisinden, isimsiz kullanıcılar için Profile kullanımını aktif hale getirmemiz gerekir. Varsayılan olarak bu özellik kapalıdır. Çünkü, isimsiz kullanıcılar için Profile kullanımı özellikle veritabanı kaynaklarını ve doğal olarakta web sunucusu kaynaklarını çok fazla harcayacaktır.

<anonymousIdentification enabled="True" cookieless="AutoDetect" />
Buradaki örnekte cookieless özelliğine AutoDetect değeri atanmıştır. Yani isimsiz kullanıcı için oluşturulan id değerinin istemci bilgisayarında Cookie şeklinde mi, yoksa url ile birlikte taşınacak şekilde mi tutulacağına Asp.Net karar verecektir. Cookieless niteliğinin alabileceği diğer değerler ise UseCookies, UseUri ve UseDeviceProfile ’ dir. Böylece artık sistem içerisinde isimsiz kullanıcılar için Profile bilgisinin kullanılabileceğinide söylemiş oluyoruz. Lakin var olan Profile özellikleri içerisinde de hangilerinin isimsiz kullanıcılar için geçerli olacağına karar vermemiz ve bunu belirtmemiz gerekiyor. Bunun için tek yapmamız gereken istediğimiz özelliğin allowAnonymous niteliğine true değerini atamak olacaktır.

<add name="SonSayfa" type="UrlInfo" serializeAs="Binary" allowAnonymous="true"/>
Görüldüğü gibi Asp.Net 2.0 kişiselleştirme adına Framework Class Library içerisine oldukça güçlü bir tip atmıştır. Profile tipinin yukarıda değindiğimiz özellikleri dışında daha pek çok kabiliyetide elbette vardır. Bunların araştırılmasını siz değerli okurlarıma bırakıyorum. Böylece geldik bir makalemizin daha sonuna. Bir sonraki makalemizde görüşünceye dek hepinize mutlu günler dilerim.

Örnek Uygulama İçin Tıklayın.

Burak Selim ŞENYURT
selim@bsenyurt.com
Makale:
Asp.Net 2.0 Profile API ile Personalization (Kişiselleştirme) ASP.NET Burak Selim Şenyurt
  • Yazılan Yorumlar
  • Yorum Yaz
KAS
24
2009
Güzel ve Açıklayıcı bir yazı. Çok teşekkürler. Bu ASP 2.0 ile gelen kişiselleştirme özelliğini web servislerinde de kullanabilir miyiz? Ya da web servisi ile bu profil datalarının tutulduğu database'e okuma/yazma yapmak için erişebilir miyiz?
HAZ
10
2006
???????????*
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor