Bu sefer Web 2.0 ile birlikte artık her yerde karşımıza çıkan RSS veri akışlarını okumaya yarayan bir web uygulaması hazırlayacağız. RSS okuyucular temel olarak, internetteki bir veri kaynağının ürettiği XML formatındaki yayın akışlarını çekip, bunları kendi arayüzünde kullanıcıya aktarırlar. Günümüzde birçok haber sitesi, sözlük, forum ve blog gibi kullanıcıların içeriği oluşturduğu sayfalar yayın akışlarını RSS kullanarak XML formatında izlenebilmesine imkan sağlıyorlar. Web portalları, Facebook ve MSN gibi yoğun olarak kullandığımız sitelerde de RSS okuyucuları yardımıyla, diğer sitelerde güncellenen konuları özet olarak görebiliyoruz.

Uygulamaya geçmeden önce AJAX kullanmamızın nedenlerinden bahsedelim. Aslında ASP.NET ile geliştirilen bir RSS okuyucusu da işimizi görebilirdi.  Fakat bu yayın akışlarının bilgileri sürekli güncellendiği için (ör. Bir haber sitesinin güncel haberlerinin özet akışları.) sayfamızdaki uygulamanın sürekli yenilenmesi gerekmekte. AJAX öncesi sistemleri hatırlarsak, uygulamamızda bir yenilenme söz konusu olduğunda sayfamızda önce bir tık sesi, ardından beyaz bir ekran ve bütün sayfanın tekrardan oluştuğu, kullanıcıların dikkatini dağıtan bir yenilenme (postback) işlemi gerçekleşmekteydi. Biz bu işlemleri AJAX içerisinde bir zamanlayıcı (timer) kullanarak otomatik olarak gerçekleştireceğiz, ve kullanıcı sayfada gezerken yayın akışlarındaki güncellemeleri bir masaüstü uygulamasındaki gibi dinamik olarak görebilecek. Son olarak güncel bir Visual Studio sürümü kurulu bilgisayarınıza AJAX yeteneklerini kazandırabilmeniz için http://ajax.asp.net adresinden Microsoft’un “AJAX Extensions” eklenti paketini indirip kurmanız gerektiğini belirtelim. Mevcut “AJAX Extensions 3.5” sürümü VS 2005 ve VS 2008 üzerinde çalışabilmekte.

Kurulum işlemlerini bitirip uygulamaya başlamaya hazırsanız biraz RSS kaynaklarının formatından bahsedelim. Daha önceden yayın akışlarının XML formatında veriler ilettiğini söylemiştik. Bu veriler temel olarak sayfadaki yayınların başlığını, konuyla ilgili resimleri ve konunun ilişkili linkini, yayımlanma tarihini ve kısa bir özetini içerebilirler. Özetleri aldığımız kaynaktaki xml dokümanda bu içerikler bazı standart etiketler (tag) ile (bkz. Rss etiketleri tablosu) sabittir ve RSS okuyucuları bu etiketleri kullanarak içeriği yorumlar. Hazırlayacağımız bu RSS okuyucuyu sayfanıza ekleyerek, kullanıcılarınız sayfanızla ilgili içeriğe sahip sitelerdeki gelişmelerden anında haberdar edebilir, veya sayfanızda oluşturduğunuz içeriği bu uygulama ile başka sitelerde yayınlayabilirsiniz.

Sık kullanılan rss etiketleri ve hiyerarşisi bu şekilde.

SAYFA TASARIMI

Uygulamamızı bir tablo içerisinde, daha önceden verilen bir RSS kaynağını okuyarak otomatik olarak içeriğini güncelleyebilecek şekilde planladık. Böyle bir uygulamanın ihtiyacı olan her şey .NET Framework ve AJAX Extensions içerisinde mevcut olduğundan, ayrıca Visual Studio ile gereken modülleri fareyle sayfamıza sürükleyerek kullanabildiğimizden çok yorulmayacağımızı şimdiden söylemeliyim. İlk olarak yapmamız gereken, Visual Studio ile yeni bir “Web Site Project” oluşturmak, ve eğer VS 2005 sürümünü kullanıyorsak seçenekler içerisinden “Ajax Enabled Web Site” seçeneğini seçtiğimizden emin olmak. Karşımıza default.aspx sayfasının dizayn ekranı gelince, uygulamada kullanacağımız modülleri sayfamıza taşımaya başlayabiliriz. Eğer VS 2008 versiyonunu kullanıyorsak, Tools içindeki Ajax Extensions modüllerinden ScriptManager’i sayfamıza eklememiz gerekiyor.  Yine Ajax Extensions içerisinden UpdatePanel, ve içine bir adet Timer objesini sayfaya eklerseniz, tasarım aşamasına geçebilirsiniz. RSS okuyucusu tasarımının en önemli tarafı, eklediğiniz öğeleri UpdatePanel içerisine taşıdığınızdan emin olmalısınız. Ben bir tane Table (2×1 formatında) ve iki adet Label ekleyerek sade bir tasarım yaptım, siz kendi sitenize uygun bir biçimde burayı çeşitlendirebilirsiniz. Bileşenlerin yer aldığı formun kodlarını aşağıda görebilirsiniz.


<asp:ScriptManager ID="ScriptManager1" runat="server" />

<div>

<asp:UpdatePanel ID="UpdatePanel1" runat="server">

<ContentTemplate>

<asp:Timer ID="Timer1" runat="server" OnTick="Timer1_Tick" Interval="60000">

</asp:Timer>

<asp:Table ID="Table1" runat="server" BorderColor="Navy" BorderStyle="Dashed" BorderWidth="3px" CellPadding="0" CellSpacing="0"  ForeColor="White">

<asp:TableRow runat="server" BackColor="SlateGray" Font-Names="verdana" Font-Size="10pt" Width="400px">

<asp:TableCell runat="server" Width="300px">

<asp:Label ID="Label1" runat="server" Font-Bold="True" Text="PC Magazin Forumlarında Son 10 başlık"></asp:Label></asp:TableCell>

</asp:TableRow>

<asp:TableRow runat="server" BackColor="WhiteSmoke" Font-Names="verdana" Font-Size="10pt"

ForeColor="Black" BorderWidth="0px" HorizontalAlign="Left" VerticalAlign="Top" Width="400px">

<asp:TableCell runat="server" BackColor="WhiteSmoke">

<asp:Label ID="Label2" runat="server"></asp:Label></div>

</asp:TableCell>

</asp:TableRow>

</asp:Table>

</ContentTemplate>

</asp:UpdatePanel>

</div>


RSS okuyucumuz PC Magazine forumlarını yakından takip ediyor..

RSS OKUYUCU HAZIRLAMAK

Yayın akışı kaynağının verileri XML olarak gönderdiğinden bahsetmiştik. Bu nedenle okuyucumuz aslında RSS standart etiketlerini kullanan bir XML okuyucudan ibaret. Okunan verileri bir StringBuilder ile birleştirerek, dizaynımızda eklediğimiz Label’ın text özelliğine eşitlememiz gerekiyor. Programlamaya başlamadan önce System.Xml, ve System.Text bileşenlerini sınıfımıza eklemeliyiz. Yine dizayn esnasında eklediğimiz Timer’ın zaman aralığını default 60000ms değerinde bırakırsanız, okuyucu 60 saniyede bir asenkron olarak içindeki verileri güncelleyecektir.  Örnek amaçlı hazırladığımız uygulamada, dergimizin forumlarındaki son 10 konu başlığını ve özetini görüntülensin istiyoruz. Ayrıca konu başlığına tıklayınca ilgili sayfaya gitmesi için sayfanın linkini de eklemeliyiz. Bu durumda RSS 2.0 etiketlerinden başlık (title), link ve açıklama (description)  etiketlerini kullanmamız yeterli olacaktır. Bütün xml okuma işlemlerini toplayacağımız string tipinde değişken döndüren bir metod ile gereken bilgileri tablomuzun içindeki Label objesine iletebiliriz. Framework içerisindeki XmlTextReader sınıfından bir objeye PC Magazine Forumlarının RSS kaynağının adresini verip, kaynaktan dönmesini beklediğimiz xml sayfası içerisinde istediğimiz etiketleri arayacağız. Bu etiketlere sahip elemanları (varsa eğer) bir string değişkeninde kaydedip sonucu döndüreceğiz. Dikkat edilmesi gereken nokta, istediğimiz etiketlere sahip elemanların, okuyucuya verdiğimiz xml kaynağı içerisinde olmaması; hatta verdiğimiz kaynak adresinin zaman içerisinde yanıt vermemesi veya ulaşılamaması durumunda sayfamızın yorumlanamayacağı ve hata vereceğidir. Böyle bir durumda olası hataların önüne geçebilmek için, xml okuma işlemini bir try-catch bloğu içerisinde yapmamız doğru olacaktır. Veri kaynağına bağlanmaya ve verileri okumaya yarayan satırları bir try-catch bloğu içinde yazarsak, bu işlemlerde herhangi bir hatayla karşılaşırsak bile bunu “Yeni bir başlık okunamadı?” gibi bir hata mesajıyla kullanıcılara çaktırmamak mümkün J.  Yayın akışını okumaya yarayan RssOku metodumuzun içeriği aşağıda görülebilir.


private string RssOku()

{

//Okunacak RSS kaynağının adresi (ör: dergimizin forumları).

string url =http://www.pcmag.com.tr/forum/index.php?type=rss;action=.xml";

//Kullandığımız XML etiketleri için değişkenler.

string baslik = null;

string link = null;

string aciklama = null;

//Kaç tane özet göstereceğimizi tutan değişken.

int ozetSayisi = 10;

//RSS kaynağını okuyacak xml reader nesnesi.

XmlTextReader okuyucu = null;

//Okunan bilgileri String Builder ile birleştireceğiz.

StringBuilder okunan = new StringBuilder();

okunan.Append("<ul>");//("<ul>");

//Kaynağa ulaşırken veya okuma esnasında oluşabilecek hatalara karşı,

//işlemlerimizi try-catch bloğu içerisinde yapıyoruz.

try

{

//Kaynak adresini okuyucu'ya verince hazırız.

okuyucu = new XmlTextReader(url);

okuyucu.MoveToContent();

//Kaynaktan okumaya başlıyoruz.

while (okuyucu.Read())

{

//Döküman içinde bir akış bulursak, bilgilerini toplamaya başlıyoruz.

if (okuyucu.Name == "item" && okuyucu.NodeType == XmlNodeType.Element)

{

//İstediğimiz sayıda başlık okuduysak devam etmeye gerek yok.

if (ozetSayisi-- == 0)

break;

//Eğer istediğimiz kadar okuyamadıysak devam edelim.

okunan.Append(" » ");

}

//Akışın başlık bilgisini ekle.

if (okuyucu.Name == "title")

baslik = okuyucu.ReadString();

//Akışın linkini ekle.

if (okuyucu.Name == "link")

link = okuyucu.ReadString();

//Akışın açıklamasını ekle.

if (okuyucu.Name == "description")

aciklama = okuyucu.ReadString();

//Akış bitiyorsa bütün bilgileri string değişkenine kaydet.

if (okuyucu.Name == "item" && okuyucu.NodeType == XmlNodeType.EndElement)

{

//bütün bilgiler değişkene html biçiminde eklenecek.

okunan.Append("<a href='");

okunan.Append(link);

okunan.Append("' target=\"_blank\">");

okunan.Append(baslik);

okunan.Append("</a>");

okunan.Append("<br />");

okunan.Append(aciklama);

okunan.Append("<br />");

}

}

}

//Eğer okuma sırasında bir hata olursa buradaki mesaj döndürülecek.

catch (Exception e)

{

return "Yeni bir başlık yok.";

}

//Sunucumuzu yormamak adına Xml okuyucumuzu kapatmalıyız.

okuyucu.Close();

//Yayın akışlarından kaydedilen bilgileri döndür.

return okunan.ToString();

}


Gereken araçları toolbardan eklediğimizde sayfanın görünümü

SON DÜZENLEMELER

Yayın akışlarını okuyup string tipinde bir değişken döndüren metodumuz hazır olduğuna göre işin büyük bir bölümünü bitirdik sayılır. Şimdi bu metodu sayfamıza entegre etmek kalıyor. ASP.NET ile ilgilenenler veya önceki sayılarımızı takip edenlerin yakından tanıdığı ünlü Page_Load olayını (event) kullanarak tablomuzdaki Label objesinin text değerine (Bizim dizaynımızda objenin ismi “Label2”.)  RssOku() metodumuzun sonucunu atayarak, sayfamız açıldığında uygulamamızın yüklenmesini sağlamış olacağız:


protected void Page_Load(object sender, EventArgs e)

{

Label2.Text = RssOku();

}

Tebrikler, artık çalışan bir RSS okuyucumuz var. Fakat en başta amacımız, sadece sayfa açıldığında açılan bir okuyucu değildi. Uygulamamızı arka planda sessizce içeriğini güncelleyecek bir şekilde dizayn etmiştik. Bu aşamada önceden UpdatePanel içerisine yerleştirdiğimiz Timer devreye giriyor. Hatırlarsanız, bu Timer default 60 saniyelik bir aralığa sahipti. O zaman dizayn ekranındaki Timer kontrolünün üzerine çift tıklayıp, Visual Studio’nun Timer1_Tick  olayını yaratmasına yardımcı olalım ve Page_Load olayında yaptığımız işlemin aynısı burada tekrarlayalım ki her Tick olayında RSS okuyucumuzun içeriği otomatik olarak güncellensin:


protected void Timer1_Tick(object sender, EventArgs e)

{

Label2.Text = RssOku();

}

Şimdi amacımıza gerçekten ulaştık, uygulamamız kendini asenkron bir biçimde yenileyebilecek. Artık birçok web 2.0 sayfasındaki içeriği web sayfanızda canlı bir şekilde yayınlayabilir, sayfanızı ziyaret edenlerin bilgiye daha kolay ulaşmalarına yardımcı olabilirsiniz. Konu RSS olunca, bu uygulamayla birçok kaynağı takip etme olanağı bulabilir, anlık veri değişimleri gerçekleşen (borsa verileri gibi) içerikleri web sayfanıza entegre edebilirsiniz. Kullandığınız kaynak destekliyorsa, farklı RSS etiketleri kullanarak (Resim, yorum, oy, vb.) yeni bileşenlerini de bu uygulamaya ekleyebilir, RSS okuyucunuzu daha interaktif hale getirebilirsiniz. Böyle bir durumda yapmanız gereken tek şey, RssOku metoduna yeni bir değişken atamak ve xml veriyi okurken bu değişkenin rss etiketini kayda almak olacak (ör. resim eklemek için “image” etiketini kullanmak).

Tekrar hatırlatmak gerekir ki, böyle bir uygulamayı “AJAX Extensions” kütüphanesini kullanmadan, javascript kodlarıyla yapmaya kalksak açıklamasını bu sayfalara sığdırmamız mümkün olmayacaktı. Visual Studio’nun imkanları, birçok şeyi arka planda otomatik gerçekleştirdiği için bu yeni teknolojiyi kısa zamanda ve en az kod satırıyla kullanmamıza olanak sağladı.

Örnek Uygulamanın Kodları: AJAXEnabledWebSite2

Örnek uygulama: http://www.yigitkiran.net/rssReader/

p.s.: Bu makale subat 2008 tarihli PC Magazine dergisinde yayınlanan makalemi kesip biçerek derlediğim ocak 2008 tarihli bir yazıdır ki kullanılan IDE ve kütüphaneler güncel değildir.

No related posts.