Ana Sayfa >> ASP.Net >> ASP.Net ile Dinamik Sitemap Oluşturma
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
 Ergün YÜCEL
 Koray KOCABAŞ
 Yazılım Uzmanı
 Yaz Geliştir
 Yazılım Günlüğü
 Code Project

Takvim
<Ağustos 2008>
PztSalÇarPerCumCmtPaz
28293031123
45678910
11121314151617
18192021222324
25262728293031
1234567

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

 
 ASP.Net ile Dinamik Sitemap Oluşturma

Bu makalemde sizlere Site Map sisteminden söz edeceğim. Site Map, Türkçe karşılığı Site Haritası anlamına gelmektedir. Sitedeki tüm linklerin tek bir sayfa altında toplanması olarak kabul edebiliriz. Arama motorlarının sitenizi daha hızlı ve doğru indekslemesini sağlamaktadır.
 

Makaleyi yazmadan önce bir örnek oluşturdum, Google’a bu haritayı ilettim rekor bir hız (29 Dk) ile hazırladığım sitemap’e ulaşıldı ve indeksleme işlemi başlatıldı.
 

Bizde dinamik bir site haritası oluşturacağız. Öncelikle projemizde sitemap.aspx isminde bir sayfa oluşturalım ve html içeriğini aşağıdaki gibi düzenleyelim. 
 


<%
@ Page EnableViewState="false" Language="C#" CodeFile="sitemap.aspx.cs" Inherits="sitemap" %>
<%
@ OutputCache Duration="300" VaryByParam="none" %>

 
Daha sonra sayfanın Page_Load olayında kodlarımızı yazmaya başlayalım. 
 

 
//Sayfanın içeriğini temizliyoruz...
Response.Clear();
//Sayfanın xml formatında olduğunu belirliyoruz...
Response.ContentType = "text/xml";
//XML formatını oluşturmak için bir XmlTextWriter tanımlıyoruz ve
//Encoding'ini UTF8 olarak ayarlıyoruz...
XmlTextWriter objX = new XmlTextWriter(Response.OutputStream, Encoding.UTF8);
//Bu kısımda sırayla elementlerimizi oluşturuyoruz...
//urlset, url, loc, lastmod vs... gibi tanımlar
//bir standart tüm site map dosyalarında bu şekilde tanımlanırlar...
//Kaynak : http://www.sitemaps.org/protocol.php
objX.WriteStartDocument();
objX.WriteStartElement(
"urlset");
//Site Map standartlarını belirliyoruz...
objX.WriteAttributeString("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9");
objX.WriteAttributeString(
"xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
objX.WriteAttributeString(
"xsi:schemaLocation", "http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/siteindex.xsd");
//Sitenin sabit sayfalarını static olarak ekliyoruz...
objX.WriteStartElement("url");
//loc = Sayfa Adresi
objX.WriteElementString("loc", "http://www.gokhanbagci.info/default.aspx");
//lastmod = En Son Değiştirilme tarihi
//default.aspx Ana Sayfamız olduğu için her gün güncellendiğini varsayıyoruz
//çünkü bu tarihler arama motorlarının sitenizin güncel olup olmadığı bilgisine karar veriyorlar...
objX.WriteElementString("lastmod", DateTime.Now.ToString("yyyy-MM-dd"));
//changefreq = Sayfanın ne kadar süre içerisinde oluşturulduğunu belirliyor...
//monthly, weekly, daily ve hourly seçenekleri mevcut...
//Şöyle bir mantığı var, daily aynı gün içinde eklendiğini belirliyor.
//Arama motorlarıda o sayfaya ona göre önem veriyor.
//Burada tabi o zaman hepsini daily yaparsak daha önem kazanır diye düşünmeyelim
//Çünkü bu robotlar akıllı şeyler :) Tarihe göre ve daha önceki indekslere göre karşılaştırma yapıyorlar...
objX.WriteElementString("changefreq", "daily");
//priority = Sayfanın sitedeki önemini belirliyor...
//Şöyle ki, örneğin Ana Sayfa için priority değerini 1 olarak tanımladık...
//Ama biraz sonra aşağıda Haberleri dinamik olarak eklerken sayfanın değerini 0.1 olarak belirleyeceğiz...
//Yani alt sayfaların değerlerini daha düşük, ana sayfaların değerlerini daha yüksek belirleyeceğiz...
objX.WriteElementString("priority", "1");
objX.WriteEndElement();
objX.WriteStartElement(
"url");
objX.WriteElementString(
"loc", "http://www.gokhanbagci.info/yazilar.aspx");
objX.WriteElementString(
"lastmod", DateTime.Now.ToString("yyyy-MM-dd"));
objX.WriteElementString(
"priority", "1");
objX.WriteElementString(
"changefreq", "daily");
objX.WriteEndElement();
//Bu kısımda ben access veritabanı kullanmıştım ama aynı şekilde SQL Server, MySQL, Oracle vs..
//diğer veritabanlarınıda kullanabilirsiniz...
OleDbConnection objConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("~/App_Data/gb.mdb"));
objConnection.Open();
//Bu kısımda blog örneği yapıyorum, Bloglardaki yazılarla ilgili...
//Siz makale, haber vs.. bu konularlada bu sistemi kullanabilirsiniz.
string sql = "SELECT YaziID, KTarih FROM yazilar ORDER BY YaziID DESC";
OleDbCommand objCommand = new OleDbCommand(sql, objConnection);
OleDbDataReader objReader = objCommand.ExecuteReader();
//Dönen verileri bir döngüye sokup ayrı ayrı elementler oluşturacağız...
while (objReader.Read())
{
     objX.WriteStartElement(
"url");
    
//Veritabanındaki değere göre linkimizi oluşturuyoruz...
     //Ör : http://www.gokhanbagci.info/yazi-detay.aspx?YaziID=1
     objX.WriteElementString("loc", "http://www.gokhanbagci.info/yazi-detay.aspx?YaziID=" + objReader.GetInt32(0).ToString());
    
//Oluşturulma tarihini belirliyoruz...
     objX.WriteElementString("lastmod", objReader.GetDateTime(1).ToString("yyyy-MM-dd"));
    
//Bu kısımda eklediğimiz tarihle o günkü tarih arasındaki farkı bulup daily, weekly, monthy değerlerini buşuyoruz
     //Eklediğimiz gün bugüne eşit olduğu için daily olarak belirliyoruz...
     if (objReader.GetDateTime(1).ToShortDateString() == DateTime.Now.ToShortDateString())
     {
          
//İpucu:Bugün eklenen sayfaların önemini yüksek tutuyoruz!
           objX.WriteElementString("priority", "1");
           objX.WriteElementString(
"changefreq", "daily");
     }
    
else 
     {
          
//Bu kısımda iki tarih arasındaki farkı hesaplıyoruz...
           int fark = TarihFark(objReader.GetDateTime(1), DateTime.Now);
          
//Eğer fark 1 ile 7 arasında ise sayfanın weekly olduğunu belirliyoruz...
           if ( (fark > 1) && (fark <= 7) )
           {
              
//İpucu:Haftalık sayfalara 0.5 değerini ekliyoruz...
               objX.WriteElementString("priority", "0.5");
               objX.WriteElementString(
"changefreq", "weekly");
           }
          
//Eğer 7'den büyükse monthly olduğunu belirliyoruz...
           else if (fark > 7)
           {
              
//İpucu:Aylık sayfalarada daha önemsiz olduğunu 0.1 olarak belirtiyoruz
               //Bu değerler size kalmış 0.1 yerine 0.2'de kullanabilirsiniz...
               //Ama ne kadar düşük kullanırsanız robot o kadar daha mantıklı indeksleme yapacaktır...
               objX.WriteElementString("priority", "0.1");
               objX.WriteElementString(
"changefreq", "monthly");
           }
      }
      objX.WriteEndElement();
}
objReader.Close();
objConnection.Close();
objX.WriteEndElement();
objX.WriteEndDocument();
objX.Flush();
objX.Close();
Response.End();
 


İki Tarih arasındaki farkı aldığımız methodumuz:

 
public
int TarihFark(DateTime tr1, DateTime tr2)
{
   
TimeSpan Sonuc;
    Sonuc = (tr2 - tr1);
   
return (Sonuc.Days);
}
 


Örnek Site Map dosyası :
http://www.gokhanbagci.info/sitemap.aspx


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


Gökhan BAĞCI
Microsoft Certified Professional

Eklenme Tarihi: 05.12.2007 09:24:00
Yorum Yaz
Gönderen
Başlık
Yorum


Yorumlar
Güzel...
Gerçekten güzel bir makale olmuş, emeğinize sağlık...
Yazan: Erdem CAN , Tarih: 03.12.2007
İşime yaradı...
Çok güzel bir makale olmuş eline sağlık fakat hata veriyor objX.WriteAttributeString("xmlns", http://www.sitemaps.org/schemas/sitemap/0.9); buradaki web adreslerinde tırnak gerekiyormu tam çözemedim:S
Yazan: mahmut , Tarih: 04.08.2008
>>nahnut
Evet orada tırnak olması gerekiyor. Sayfanın editörü copy/paste ederken linke çevirmiş o yüzden hata alıyorsun.
Yazan: Gökhan BAĞCI , Tarih: 11.08.2008

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