Ana Sayfa >> ASP.Net >> Global.asax ile ReWriter Path
Kategoriler
 ASP.Net
 C#.Net
 VB.Net
 SQL Server
 SQL Script
 Eğlence
 Haberler
 Görsel Ders
 Ücretsiz Programlar
 Diğer

Dost Siteler
 Volkan KORKMAZ
 Sem GÖKSU
 Mustafa Altuntaşlar
 Adnan TÜRK
 Ergün YÜCEL
 Koray KOCABAŞ
 Yazılım Uzmanı
 Yaz Geliştir
 Yazılım Günlüğü
 Code Project

Takvim
<Mart 2010>
PztSalÇarPerCumCmtPaz
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234

Hakkımda
Windows Live Alerts
 E-Posta
 Msn ( )
 Skype


Login with Facebook
 
 Global.asax ile ReWriter Path
Bu makalemde sizlere Url ReWriter Path konusundan bahsedeceğim. Türkçe karşılığı nedir bende tam olarak bilmiyorum ama url adlandırma şeklinde çevirsek çok kaba olmaz sanırım :) Son zamanlarda sıkça karşımıza çıkan bir durum internet sitelerinde.

En basit örneği kendi Kişisel web sayfamdan göstereyim. www.gokhanbagci.info/Articles/19-il-ilce-semt-veritabani-sql-server-2005.aspx şeklinde sayfa isimleri görüyoruz browserımızın adres çubuğunda, aslında böyle bir sayfa yok! Ama biraz sonra global.asax dosyamız içerisinde yazacağımız  kodlarla bunu arka planda detay.aspx?ID=19 şekline çevireceğiz. Böylelikle arka planda detay.aspx çalışacak ama kullanıcılar yeniden adlandırdığımız sayfa isimlerini görecek.

Hoş arka planda madem böyle çalışacak neden bu kadar uğraşacağız derseniz tabii ki bir sebebi var :) Arama motorları sayfalarımızı indekslerken bizim adlandırdığımız şekilde kayıtları tutacak. Buda daha sonra yapılan arama sorgularında daha başarılı sonuçlarla, daha öncelikli olarak listelenmesini sağlayacaktır.
Not: Arama sonuçlarında her zaman sayfa url’leri başlık ve içeriğe göre daha fazla öncelik sağlar.

Gelelim örnek veritabanımızı ve kodlarımızı yazmaya...



Image2.jpg

Veritabanımızı oluşturduktan sonra projemize bir adet global.asax dosyası ekliyoruz. Daha sonra “Makale” isminde bir klasör ve içerisinede Detay.aspx isminde bir sayfa ekliyoruz. Listelemek içinde ana root’taki Default.aspx sayfasını kullanacağız. Sırasıyla Global.asax, Default.aspx ve Detay.aspx kodlarını yazmaya başlayalım.

Global.asax


<%
@ Application Language="C#" %>
<script runat="server">
    void Application_BeginRequest(Object sender, EventArgs e)
    {
        //İşlemleri yapacağımız sayfanın url bilgisini alıyoruz...
        //Ör: /Makale/19-il-ilce-semt-veritabani-sql-server-2005.aspx      
        string DosyaYolu = Request.RawUrl;
        //IndexOf ile url bilgisinde Makale klasörünün geçip geçmediğini kontrol ediyoruz,
        //Bu kontrolü yapmazsak tüm dosyalarda ReWriter işlemi yapmaya çalışacaktır...
        if (DosyaYolu.IndexOf("/Makale/") != -1)
        {
            //Bu kısımda uzantıyı html olarak belirledik, isterseniz aspx, rss, xml gibi
            //uzantılarıda kullanabilirsiniz. Hatta kendi belirlediğiniz uzantılarıda yazabilirsiniz.
            if (System.IO.Path.GetExtension(DosyaYolu) == ".html")
            {
                //Bütün kontrolleri aştıktan sonra bu kısımda MakaleID 'sini alacağız...
                //Split ile url'yi dize haline getirip 19 sayısına ulaşacağız.
                string[] path = System.IO.Path.GetFileName(DosyaYolu).Split('-');
                //İlk parametrede gerçek sayfa pathini, daha sonra MakaleID'yi gönderiyoruz...
                Context.RewritePath("~/Makale/Detay.aspx", "", "MakaleID=" + path[0], true);
            }
        }
    }
</script>
 

Default.aspx


<
asp:Repeater ID="Repeater1" runat="server">
    <ItemTemplate>
        <li><asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl='<%# ReWriterPath(Eval("MakaleID").ToString(), Eval("Baslik").ToString()) %>'><%#Eval("Baslik") %></asp:HyperLink></li>
    </ItemTemplate>
</asp:Repeater>
 

Default.aspx.cs


protected
void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        SqlConnection con = new SqlConnection("Server=E6750; Database=ReWriter; Trusted_Connection=True;");
        //Veritabanımızdan eklediğmiz makaleleri çekip Repeater'ımıza ekliyoruz...
        SqlDataAdapter da = new SqlDataAdapter("Select * From Makaleler", con);
        DataTable dt = new DataTable();
        da.Fill(dt);
        Repeater1.DataSource = dt;
        Repeater1.DataBind();
    }
}

public string ReWriterPath(string MakaleID, string Baslik)
{
    string Temp = "";
    //Bu kısımda çeşitli replace işlemleri yapacağız çünkü adres çubuğunda
    //geçerli olmayan karakterler karşımıza çıkacaktır Ör: ğşü# vs...
    //ve url'yi daha anlamlı hale getirmek için bunları replace etmeliyiz...
    Temp = Baslik.ToLower();
    Temp = Temp.Replace("-", ""); Temp = Temp.Replace(" ", "-");
    Temp = Temp.Replace("ç", "c"); Temp = Temp.Replace("ğ", "g");
    Temp = Temp.Replace("ı", "i"); Temp = Temp.Replace("ö", "o");
    Temp = Temp.Replace("ş", "s"); Temp = Temp.Replace("ü", "u");
    Temp = Temp.Replace("\"", ""); Temp = Temp.Replace("/", "");
    Temp = Temp.Replace("(", ""); Temp = Temp.Replace(")", "");
    Temp = Temp.Replace("{", ""); Temp = Temp.Replace("}", "");
    Temp = Temp.Replace("%", ""); Temp = Temp.Replace("&", "");
    Temp = Temp.Replace("+", ""); Temp = Temp.Replace(".", "-");
    Temp = Temp.Replace("?", ""); Temp = Temp.Replace(",", "");
    return "Makale/" + MakaleID + "-" + Temp + ".html";
}
 

Detay.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        //Normalde path 19-aspnet-ile...aspx gibi görünüyor,
        //Ama global.asax ile arka planda path'i değiştirdiğimiz için
        //Request.QueryString["MakaleID"] bize 19 değerini döndürecektir...
        string MakaleID = Request.QueryString["MakaleID"].ToString();
        //Daha sonra bu id'ye göre işlemlerinizi yapabilirsiniz...
        //Aşağıdaki kodlarda kabaca makale detaylarını sayfaya yazdırıyorum...
        SqlConnection con = new SqlConnection("Server=E6750; Database=ReWriter; Trusted_Connection=True;");
        SqlDataAdapter da = new SqlDataAdapter("Select * From Makaleler Where MakaleID=@MakaleID", con);
        da.SelectCommand.Parameters.AddWithValue("@MakaleID", MakaleID);
        DataTable dt = new DataTable();
        da.Fill(dt);
        Response.Write("<b>MakaleID</b>: " + dt.Rows[0]["MakaleID"].ToString() + "<br>");
        Response.Write("<b>Başlık</b>: " + dt.Rows[0]["Baslik"].ToString() + "<br>");
        Response.Write("<b>İçerik</b>: " + dt.Rows[0]["Icerik"].ToString() + "<br>");
    }
}

Ve sırasıyla ekran çıktılarımıza göz atalım…



Global.asx ile ReWriter Path linkine tıklayoruz ve aşağıdaki gibi sonuca ulaşıyoruz...


Path konusunda daha farklı adlandırmalarda yapabiliriz. Ör: /global-asax-ile-rewriter-path/1.aspx gibi... Bu şekilde yapmış olsaydık global.asax dosyamızda IndexOf yerine split “/” ile parçalara bölüp path sayısına göre adlandırma işlemini yapabiliriz.

Başka bir makalemde görüşmek dileğiyle...

Gökhan BAĞCI
Microsoft Certified Professional

Eklenme Tarihi: 19.12.2007 21:30:00
Yorum Yaz
Gönderen
Başlık
Yorum


Yorumlar
Süper...
Elinize, emeğinize sağlık... Çok fazla türkçe kaynak yoktu bu konuda güzel bir kaynak oldu bizler için. Tşk...
Yazan: Recep KAYA , Tarih: 29.12.2007

Bu ve bunun gibi makaleleriniz için teşekkür ederiz asp.net konusunda ilerlememde sizin makaleleriniz bana cpok yrdımcı oldu. saol
Yazan: Emrah Mersinli , Tarih: 29.12.2007
Hata
bu projeyi yaptım ama hata alıyorum server da calıstırınca local da calısıor serverda ise hersey tamam ama detay.aspx de malkaleıd null olarak goruluyor ve hata veriyor bu yuzden de makalelere baglanamıyorum nasıl duzeltebilirim
Yazan: Mehmet , Tarih: 15.01.2008

Bu konuda işe yarar türkçe kaynak yoktu. Çok Teşekkürle.
Yazan: Özge , Tarih: 17.01.2008
bir sorun
elinize sağlık güzel bi makale olmuş fekat; bahsettiğiniz gibi html olarak çalışmıyor yada başka bir uzantı sadece aspx uzantısı çalışıyor bu konuda başka bir ayarlama mı yapmamız gerekir yada bizim kaçırdığımız bir şey mi var?
Yazan: murat çalışkan , Tarih: 23.01.2008
Murat Çalışkan Haklı
bende bu makaleyi gorunce uzerinde durdum fakat server da hata alıyordum ve bir türlü anlamamıstım hatayı murat arkadasımız hatanın sebebini soylemis ve dogrudur denedim ve uzantıyı .aspx yapınca calıstı zaten Gökhan Bey in sitesinde de uzantılar aspx
Yazan: Mehmet , Tarih: 25.01.2008
tesekkurler
tesekkurler ilginiz icin arastırca soylediklerinizi ;)
Yazan: Mehmet , Tarih: 26.01.2008
>> Mehmet ve Murat
Arkadaşlar aslında uzantının aspx yada html olmasından kaynaklanın bir hata değil. Uzantıyı istersek kendi belirttiğimiz şekildede değiştirebiliriz. Ör: 48-deneme.gb şeklindede yapabiliriz. Bunun için yapmamaız gereken bir işlem var. >>
Yazan: Gökhan BAĞCI , Tarih: 26.01.2008
>> Mehmet ve Murat
IIS içerisinde isapi listesinde kullandığınız uzantıyı yazmalısınız. *.aspx default olarak geldiği için sorun yaşamıyorsunuz. Detaylı bilgi için: ISAPI Extensions konusunu araştırınız.
Yazan: Gökhan BAĞCI , Tarih: 26.01.2008
Isapi Extensions
ISS yönetimi bizde ise bunu yapabiliriz sanırım ya değilse? Hostingi aldığımız firmadan mı isteyece. İlgi için teşekkür eder
Yazan: Murat , Tarih: 30.01.2008
>> Murat
Aynen dediğin gibi murat, hosting şirketinden bu işlemi yapmalarnı isteyebilirsin.
Yazan: Gökhan BAĞCI , Tarih: 30.01.2008
soru
ben de buna benzer bişeyi 404 hatası verdirerek yapmaya çalıştım.Beceremedim tabiki yüzüme gözüme bulaştı.Hangi yöntem daha mantıklı ?? Biraz akıl verir misinz ??
Yazan: ahmet , Tarih: 03.02.2008
>> ahmet
Ahmet tam olarak ne yapmak istediğini anlamadım. ReWriter Path olayından bahsediyorsan Global.asax ile yapmak en kolay yolu...
Yazan: Gökhan BAĞCI , Tarih: 04.02.2008
Tüm Site
Gökhan Selam Tüm Projede bu işlemi nasıl gerçekleştiririz. Her safya için ayrı ayrı kontrol etmeye gerek yok sanırım ??
Yazan: Mehmet KURT , Tarih: 06.02.2008
>> Mehmet KURT
Her bölüm için ayrı ayrı yapmalısın. Ama sistemi oluştururken benzer bir şekilde tasarlarsan çok fazla kod kısmıyla ayrı ayrı uğraşmamış olursun.
Yazan: Gökhan BAĞCI , Tarih: 06.02.2008
PostBack
Makale için Teşşekkürler bir sorum olucak sayfa /19-pascalagiriyoruz.aspx diye yükleniyor fakat postback olduğunda yani butonla cevap felan yazıldığında tekrar genelyazi.aspx?yaziID=19 şeklini alıyor bunu nasıl önlerim ??
Yazan: Recep SELLİ , Tarih: 15.03.2008
Eline Sağlık
Faydalı bir makale olmuş, teşekkürler.
Yazan: Mustafa , Tarih: 24.03.2008
Bi Türlü Çalıştıramamdım :S / Yardım Edbilecek ?
CS1502: The best overloaded method match for 'string.Split(params char[])' has some invalid arguments Gibi bi hata Alıyorum.Bir Türlü Çalıştıramadım.Başıma ağrılar girdi ya :S / Yardım Etmek istiyenler Olursa Mail adresim: mail@huseyinozkan.com
Yazan: Hüseyin Özkan , Tarih: 29.03.2008
>> Hüseyin Özkan
Split yaptığınız satırda yalnış değişken gönderiyorsunuz sanırım. Mail adresime global.asax dosyanızı ve hata aldığınız satırı belirterek gönderin yardımcı olurum.
Yazan: Gökhan BAĞCI , Tarih: 30.03.2008
Hyperlink yerine LinkButton ?
Hyperlink yerine LinkButton kullanılmış kodlamalarda nasıl yapacağız bunu ? Bu konuda bir örnek lütfen...
Yazan: Hasan , Tarih: 18.06.2008
>> Hasan
Linkbutton için code behind kısmında response.redirect ile yapabilirsin.
Yazan: Gökhan BAĞCI , Tarih: 24.06.2008
404
Merhaba arkadaslar /kategoriler/1-abc.html seklinde url degistiriyorum.kategoriler adli klasorumun altinda rewrite olayi icin gerekli dosya var fakat 404 not found diyor sebebi nedir neyi atliyorum acaba.tesekkur ederim.
Yazan: Eren ASIGLi , Tarih: 11.08.2008
>>Eren ASIGLi
Bu hatayı sunucu üzerinde alıyorsan büyük ihtimal isapi listesine .html uzantısını eklememiş olabilirsin.
Yazan: Gökhan BAĞCI , Tarih: 11.08.2008




2006-2008 © Gökhan BAĞCI
Tüm hakları saklıdır.