ASP.NET MVC ile RSS Oluşturma

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. Site haritası'na (sitemap.xml) göre çok daha gelişmiş ve detaylı bir veri yapısına sahiptir. Yorumlar, resimler, yayın tarihi webmaster 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.

public static SyndicationFeed CreateFeed()
{
    mhmtyylcEntities _entity = new mhmtyylcEntities();

    var feed = new SyndicationFeed("Başlık""Açıklama"new Uri("Site Adresi"));
    feed.Categories.Add(new SyndicationCategory("Blog"));
    feed.Language = "tr-TR";
    feed.Copyright = new TextSyndicationContent(
    String.Format("{0} {1}"DateTime.Now.Year, "Mehmet YAYLACI"));
    feed.LastUpdatedTime = DateTime.Now;
    feed.Authors.Add(
    new SyndicationPerson
    {
        Name = "Mehmet YAYLACI"
    });
    var feedItems = new List<SyndicationItem>();

    //Makaleleler içinde dönüyoruz.
    foreach (var item in _entity.Articles.Take(10))
    {
        var sItem =
        new SyndicationItem(
        item.Title, // Makale Başlığı
        null,
        new Uri("http://mhmtyylc.com/" + item.URL)) //Makale URL'si
        {
            Summary = new TextSyndicationContent(ContentSummary(item.ContentHtml, 499).ToString()), //Makale içeriği veya özeti
            PublishDate = item.Created //Makalenin oluşturulma tarihi
        };
        sItem.Links.Add(
        new SyndicationLink
        {
            Title = item.Title,
            Uri = new Uri("http://mhmtyylc.com/" + item.URL),
            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.

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/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ıfını yazdık. Bir action metot içinde site beslememizi paylaşabiliriz.

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

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ın içerik tipini rss olarak ayarlayıp SyndicationFeed içeriğini döndürmelisiniz.

Kaynak

MVC için SEO - RSS

Mehmet YAYLACI
YORUM YAPIN