ASP.Net 4.0 ve Routing İşlemleri

Kodla Büyü

togius

Süper Üye
Süper Üye
Mesajlar
1,730
4.0 Framework’ü ile birlikte asp.net 4.0’ın en güzel özelliklerinden biri Routing işlemlerini kolaylıkla yapabilmemiz oldu. Her ne kadar daha önceki frameworklerde de bu işlemleri çeşitli methodlarla yapsakta hiç bu kadar rahat olmamıştı. Peki bu Routing, Url Routing veya eski tabirle UrlRewrite nedir?
Aslında Türkçe karşılığını hemen bulmuşsunuzdur. Bağlantı yönlendirme veya bağlantı yeniden yazma diyebiliriz. Aslına bakarsanız bağlantıyı yorumluyor. Peki biz buna neden ihtiyaç duyuyoruz. Öncelikle sayfalar arası değer aktarımlarında (Post işlemlerini kastetmiyorum) QueryStringler bizim vazgeçilmezlerimiz. Tabi bunun şöyle dezavantajları var bu urller baktığımızda bizim bile yorumlamamız bazen anlamsız kalıyor ki arama motorları için sayfa indekslenmelerinde negatif etkisi var. Günümüz iletişim devri olduğundan ve sitelerimizin hedef kitlelerini büyük tutmamız gerektiğinden seo (Arama Motoru Optimizasyonu – Search Engine Optimization) çok mühim bir hal alıyor. Routing burada site için çok büyük bir artı sağlıyor.

Örneğin: Google’a göre
www.abcsitesi.com/haberler.aspx?id=5 mi anlamlıdır.
www.abcsitesi.com/haberler/5/Bt-sinifla ... diyor.html mi? daha anlamlıdır.

Peki biz bunu sitemizde nasıl yapacağız öncelikle sitemizin frameworkunu 4.0 yapmalıyız. Website > Start Options > Build komutlarına tıkayalım. Target Framework’ü 4.0 yapalım.

Localde sorun çıkmasa bile siteyi server’a attığınızda sorun çıkabilir. Domaininiz bulunduğu hesabınızın Asp.net 4.0 özelliğini aktif hale getirmelisiniz. Bunun içinde hosting firmanıza bir ticket çakın onlar yaparlar. Eğer yapamıyorsa firmanızı değişmenizi tavsiye ederim .
Eğer hosting firmanızda IIS 7.0 varsa bir ayar daha yapmanız lazım. Mesela bakanlık il / ilçe mem sunucuları IIS 7.0 desteği veriyor. Geçen sitemi yolladım. Çalışmadı bende bakanlığa mail attım cevap veren yok. Konuyu araştırdıktan sonra buldum. Siteyi düzelttim. Bakanlığa mail attım yine problemi giderdik diye. Web.config’ ten şu ayarı yapmanız gerekiyor dedim. İlgilenen olursa söylersiniz. Aradan 15 dk. Geçti 2 saatir gelmeyen mail geldi. Bir ayarı eksik yapıyorsunuz herhalde web.configten ayar yapmalısınız. Eleştirmek için bunu anlatmıyorum onlarında işi başından aşkın yani sorun çözümü her zaman sizde olmayabilir lakin Security Permission ayar hataları almıyorsanız çoğunlukla çözersiniz. Lakin unutmadan söyleyeyim asp.net 4.0 önceki frameworkleri kullanıyorsanız veya sadece asp ile uraşıyorsanız ISAPI – CGI ayarlarını yapılandırmanız gerekiyor.
IIS7.0 için web.config dosyamıza aşağıdaki ayarı yapalım.

Kod:
<modules runAllManagedModulesForAllRequests="true">
      <remove name="UrlRoutingModule-4.0" />
      <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
    </modules>

Dönelim konumuza
Global.asax dosyamızda aşağıdaki ayarları yapmalıyız.

Kod:
<%@ Import Namespace="System.Web.Routing" %>

void Application_Start(object sender, EventArgs e) 
    {
        this.RegisterRoutes(RouteTable.Routes);
         
    }


    void RegisterRoutes(RouteCollection routes)
    {
        routes.MapPageRoute("Haberler", "HaberDetaylari/{id}/{baslik}", "~/oku.aspx");    
    }

Tahmin etmişsinizdir ki {..} içinde olanlar değişken değerlerimiz {..} içinde olmayanlar sabit.
Ayrıca haberlerimizde yazacağımız başlık kısımlarını Türkçe karakterlerini ve özel karakterleri temizleyen bir kod yazalım. Bunu bir class olarak kaydedelim.
UrlDuzenleme adında olsun.

Kod:
public class UrlDuzenleme
{
    public UrlDuzenleme()
    {
        //
        // TODO: Add constructor logic here
        //
    }
    private static string TurkceKarakterTemizleyici(string metin)
    {
        string duzen = metin.ToLower();
        duzen = duzen.Trim();

        duzen = duzen.Replace("â", "a");
        duzen = duzen.Replace("ê", "e");
        duzen = duzen.Replace("î", "i");
        duzen = duzen.Replace("ô", "o");
        duzen = duzen.Replace("û", "u");
        duzen = duzen.Replace("ş", "s");
        duzen = duzen.Replace("ı", "i");
        duzen = duzen.Replace("İ", "ı");
        duzen = duzen.Replace("ü", "u");
        duzen = duzen.Replace("ç", "c");
        duzen = duzen.Replace("ö", "o");
        duzen = duzen.Replace("ğ", "g");
        duzen = duzen.Replace(" ", "-");
        duzen = duzen.Replace("'", "");
        duzen = duzen.Replace(".", "");
        duzen = duzen.Replace(":", "");
        duzen = duzen.Replace("\"", "");
        duzen = duzen.Replace("’", "");
        duzen = duzen.Replace("“", "");
        duzen = duzen.Replace("”", "");
        duzen = duzen.Replace(",", "");
        duzen = duzen.Replace("/", "-");
        duzen = duzen.Replace("!", "");
        duzen = duzen.Replace(";", "");
        duzen = duzen.Replace("(", "-");
        duzen = duzen.Replace(")", "");
        duzen = duzen.Replace("<", "");
        duzen = duzen.Replace(">", "");
        duzen = duzen.Replace("[", "");
        duzen = duzen.Replace("]", "");
        duzen = duzen.Replace("?", "");
        duzen = duzen.Replace("_", "");
        duzen = duzen.Replace("‘", "");
        duzen = duzen.Replace("---", "-");
        duzen = duzen.Replace("--", "-");
        duzen = duzen.Replace("%", "-");
        duzen = duzen.Replace("&", "-");
        duzen = duzen.Replace("=", "");

        duzen = duzen.LastIndexOf("-") == duzen.Length - 1
            ? duzen.Replace("-", "") : duzen;
        return duzen;
    }
    public static string ReWritePath(string yaziId, string yaziBaslik)
    {
        return yaziId + "/" + TurkceKarakterTemizleyici(yaziBaslik) + ".html";
    }
}

Peki linkleri nasıl vericen bir dünya yöntem var internette örnekleri çok kafa bulandırmamak için en basitini göstereyim.

Kod:
<asp:Repeater ID=”rp” DataSourceID=”SqlDataSourceHaberler”>
<ItemTemplate>
<a href=’ <%# "/HaberDetaylari/" + UrlDuzenleme.ReWritePath(Eval("id").ToString(),Eval("baslik").ToString()) %>
’><%# Eval(“baslik”)%></a><br/>
</ItemTemplate>
</asp:Repater>

Peki bunların okunacağı sayfada okurken ne yapıyoruz. Sorgumuzda Request.QueryString yerine RouteData.Values["ID"] kullanıyoruz.

Tabiki yönlendirme kısıtlamaları yapmalısınız. Lakin bu konu bu kadar uzamışken kısıtlama işlemlerine ayrı bir makalede düzenli ifadelerle birlikte değinmekte yarar var.
 
Geri
Üst