RSS в MVC



Почти на любом сайте нужен RSS. Далее я расскажу как сделать RSS на MVC сайте.

Создадим проект MVC.

Для того чтобы Action мог возвращать данные в виде RSS, необходимо создать класс унаследованный от ActionResult. Создадим класс RssActionResult:

public class RssActionResult : ActionResult
{
    public SyndicationFeed Feed { get; set; }

    public override void ExecuteResult(ControllerContext context)
    {
        context.HttpContext.Response.ContentType = "application/rss+xml";

        Rss20FeedFormatter rssFormatter = new Rss20FeedFormatter(Feed);
        using (XmlWriter writer = XmlWriter.Create(context.HttpContext.Response.Output))
        {
            if (writer != null)
            {
                rssFormatter.WriteTo(writer);
            }
        }
    }
}

Теперь, создадим Action метод в контроллере Home:

public ActionResult Rss()
{
    var feed = new SyndicationFeed("Feed Title", "Feed Description", new Uri("http://Myurl.com/Rss"),
        "Feed Id",
        DateTime.Now);

    var person = new SyndicationPerson("myname@myurl.com",
        "My Name", "http://Myurl.com/");
    feed.Authors.Add(person);

    feed.Copyright = new TextSyndicationContent("Copyright © 2009");
    feed.ImageUrl = new Uri("http://Myurl.com/logo.jpg");
    feed.Language = "ru-ru";

    feed.Links.Clear();
    var link = new SyndicationLink(new Uri("http://Myurl.com/Rss"), "alternate", "Title", "text/html", 1000);
    feed.Links.Add(link);

    feed.BaseUri = new Uri("http://Myurl.com/Rss");

    var items = new List<SyndicationItem>();

    var item1 = new SyndicationItem("Header 1", "Text 1",
        new Uri("http://Myurl.com/1"), "http://Myurl.com/1",
        DateTime.Now);
    items.Add(item1);

    var item2 = new SyndicationItem("Header 2", "Text 2",
        new Uri("http://Myurl.com/2"), "http://Myurl.com/2",
        DateTime.Now);
    items.Add(item2);

    feed.Items = items;

    return new RssActionResult { Feed = feed };
}

Параметры Id должны быть уникальны.

Запустим приложение и наберем ссылку http://myurl.com/Home/Rss/

PS: Корректность своего feed лучше проверять на сайте http://validator.w3.org/feed/. Он выдаст все ошибки.

Ссылка на проект: RssApplication.zip

.NET , download , MVC , сайт


Комментировать

Комментарии

arusland.blogspot.com

06.09.2009 22:19

Как я понял, в MVC для создания RSS потока есть соответствующие классы (SyndicationFeed, SyndicationPerson, и т.д).

> Параметры Id должны быть уникальны.
може придираюсь, но не понятно, что это за id и почему они должны быть уникальны?

PS: Мои конгретуляции по поповоду внедрения AdSense на свой сайт ;)

chyuck

06.09.2009 22:55

В конструкторе SyndicationLink и SyndicationFeed есть параметр Id. Речь шла о нем.
Если будет не уникален, то валидатор http://validator.w3.org/feed/ будет ругаться.
А также некотрые приложения будут отображать feed некорректно.

По поводу AdSense - это просто тест. Посмотрим что получится. :-)

Donkey-schon

07.09.2009 14:13

Классно, что стал себя пиарить через ЖЖ. Сапа в помощь!

chyuck

07.09.2009 14:15

Кто или что в помощь? :-)

Donkey-schon

07.09.2009 14:20

Что. SAPA - фактически это биржа обмена ссылками. Здесь можно и ссылочную массу в сети "накачать". И соотвественно ТИЦ повысить и , в твоем случае, PR. (Видела тут у тебя рекламу гугловскую)

Donkey-schon

07.09.2009 14:24

http://www.sape.ru/

arusland.blogspot.com

07.09.2009 14:34

Хорошо было бы, если пользователь на твоем блоге мог в настройках указать свой сайт/блог и через комментарии их можно было кликать.

chyuck

07.09.2009 15:04

Спасибо, учту :-)

delta

08.09.2009 13:58

SyndicationFeed-у далеко до элегантного кода.
(чисто из эстетических соображений)

Интересно, а можно-ли было сделать красивее...

chyuck

08.09.2009 15:34

А что в нем неэлегантного?
На мой взгляд, все хорошо.

Это просто так выглядит в браузере.
В студии наверное будет красивее.

delta

09.09.2009 9:38

Я раньше не работал с SyndicationFeed, для чего необходима строчка:

feed.Links.Clear();

delta

09.09.2009 9:41

(я о строчке в коде поста, разве после создания эта коллекция не пустая?)

arusland.blogspot.com

09.09.2009 10:10

На всякий случай :)

chyuck

09.09.2009 12:31

feed.Links.Count = 1
так как когда создаем SyndicationFeed, создается и Link.
В этом случае видится два варианта:
1. изменить существующий Link
2. удалить старый и создать новый Link (что и есть в моем случае)