2 Kasım 2011 Çarşamba

MVC için SEO - RSS

Kullanıcılar site içinde ilgilendikleri içerikler güncellendikce haberdar olmak isterler. Sitede yayınlanan beslemelere (RSS  - feed) abone olarak site içeriğini takip ederler. Arama motorlarıda benzer şekilde site değişikliklerini takip etmek için site haritaları ve site beslemelerini kullanırlar. Peki MVC ile geliştirdiğimiz sitemize web içerik besleme özelliğini nasıl entegre edebiliriz?

RSS Nedir ?

RSS (Really Simple Syndication) web içeriği abonelik formatıdır. RSS içeriği sabit bir xml yapısıdır. <rss> tagları arasında sitede yer tüm içeriği sunabilmektesiniz. Site haritası'na (sitemap.xml) göre çok daha gelişmiş ve detaylı bir veri yapısına sahiptir. Yorumlar, resimler, yayın tarihi web master bilgisine kadar geniş bir veri yapısı ile besleme oluşturabilirsiniz.

RSS ve .NET

Bu kadar gelişmiş bir veri yapısını .NET ortamında nasıl yöneteceksiniz. Üstelik veri yapısı benzerde olsa atom gibi farklı bir  abonelik formatı daha  vardır. Tüm bu farklı besleme formatlarını destekleyen bir besleme kaynağı oluşturma araçına ihtiyaçımız var. .NET yer alan SyndicationFeed sınıfı bu ihtiyacımızı karşılamaktadır.  SyndicationFeed nesnesi oluşturup site içeriğinizi feed.items altına doldurarak kendi besleme kaynağınızı oluşturabilirsiniz.

[cs]

public SyndicationFeed CreateFeed()
        {
            var pages = _pageRepository.Query();
            
            var feed = new SyndicationFeed( 
                    _settingRepository[SiteSettingKey.SiteTitle],
                    _settingRepository[SiteSettingKey.SiteSlogan],
                    new Uri(_settingRepository[SiteSettingKey.SiteUrl]));
            feed.Categories.Add(new SyndicationCategory("Blog"));
            feed.Language = "tr-TR";
            feed.Copyright = new TextSyndicationContent(
                string.Format("{0} {1}", DateTime.Now.Year, _settingRepository[SiteSettingKey.SiteTitle]));
            feed.LastUpdatedTime = DateTime.Now;
            feed.Authors.Add(
                    new SyndicationPerson
                        {
                            Name = _settingRepository[SiteSettingKey.SiteTitle], 
                            Email = _settingRepository[SiteSettingKey.Email]
                        });
            var feedItems = new List<SyndicationItem>();
            foreach (var item in pages)
            {
                var sItem = 
                    new SyndicationItem(
                        item.Title,
                        null,  /*content*/
                        new Uri(string.Format("{0}/{1}/{2}/{3}", 
                                _settingRepository[SiteSettingKey.SiteUrl], 
                                item.Published.Year, 
                                item.Published.Month, 
                                item.Slug)))
                        {
                            Summary = new TextSyndicationContent(item.Summary),
                            Id = item.Slug,
                            PublishDate = item.Created
                        };
                sItem.Links.Add(
                    new SyndicationLink
                        {
                            Title = item.Title,
                            Uri =
                                new Uri(string.Format("{0}/{1}/{2}/{3}", 
                                    _settingRepository[SiteSettingKey.SiteUrl], 
                                    item.Published.Year, 
                                    item.Published.Month, 
                                    item.Slug)),
                            Length = item.ContentHtml.Length,
                            MediaType = "html"
                        });
                feedItems.Add(sItem);
            }
            feed.Items = feedItems;
            return feed;
        }

Yukarıdaki örnekte bir besleme kaynağı (feed) oluşturulmuştur. Besleme kaynağı içerisine sitenin başlığı, url bilgisi, dil bilgisi, yazar bilgisi gibi bir çok bilgi eklenmiştir. Daha sonra sitede bulunan sayfalar feed içerisine eklenmiştir. Bu örnekte sayfa içeriğini olduğu gibi besleme kaynağına (feed) gömmek yerine sadece özet bilgisi göndermeyi tercih ettim. Beslemem içerisine hem içeriğin özetini hemde içeriğin linkini ekledim. Böylece sitemize ait içeriği webde paylaşabilecek duruma geldik.

RSS ve MVC

Rss içeriğimizi oluşturduk. Şimdi bu içeriği MVC sitemizde yayınlamamız gerekiyor. Oluşturduğumuz Rss içeriği kendi formatına sahip.  Web browser uygulamasına geri dönen değerin Rss formatına sahip olduğunu söylememiz gerekiyor. Böylece kullanıcı Rss içeriğini düzgün şekilde görüntüleyebilsin.

[cs]

public class SyndicationFeedResult : ContentResult
    {
        public SyndicationFeedResult(SyndicationFeed feed)
        {
            using (var memstream = new MemoryStream())
            using (var writer = new XmlTextWriter(memstream, System.Text.Encoding.UTF8))
            {
                feed.SaveAsRss20(writer);
                writer.Flush();
                memstream.Position = 0;
                Content = new StreamReader(memstream).ReadToEnd();
                ContentType = "application/rss+xml";
            }
        }
    }

Yukarıdaki kod bloğunda MVC ContentResult sınıfından türettiğimiz SyndicationFeedResult sınıfı  vardır. SyndicationFeedResult sınıfı içerik olarak .NET'e ait SyndicationFeed nesnesini Rss  formatında serialize etmektedir. Veri içeriğinin Rss formatında olduğunu söylemektedir.  Tüm Rss içeriğini CreadFeed() ile oluşturduk ve Rss içeriğini istemciye uygun formatta ulaştıracak SyndicationFeedResult sınıfnı yazdık. Bir action metot içinde site beslememizi paylaşabiliriz.

[cs]

public SyndicationFeedResult Feed()
        {
            var feed = CreateFeed(); 
            return new SyndicationFeedResult(feed);
        }

mvc feed görüntüsü

Sonuç

Rss ve Atom gibi web içerik besleme yapıları gelişmiş veri yapıları ile çok detaylı bir şekilde içerik paylaşmamıza olanak sağlamaktadır. Bu gelişmiş veri yapısı ve farklı veri formatları ile uğraşmadan .NET SyndicationFeed sınıfını kullanarak içerik paylaşımı yapabilirsiniz. MVC ile SyndicationFeed sınıfını entegre etmek için yeni bir ActionResult sınıfnı yazmalısınız. Özelleşmiş ActionResult sınıfınız içerik tipini rss olarak ayarlayıp SyndicationFeed içeriğini döndürmelidir.

Hiç yorum yok: