2008-08-15 3 views
110

Как бы вы рекомендовали обработать RSS-каналы в ASP.NET MVC? Использование сторонней библиотеки? Использование материалов RSS в BCL? Просто создайте представление RSS, которое отображает XML? Или что-то совсем другое?RSS-каналы в ASP.NET MVC

+1

Просто обновить этот вопрос 18 месяцев после последнего изменения - казалось разумным на вопрос " все изменилось с итерациями на .net и mvc, что изменило бы подход к проблеме управления фидами? Консенсус (через другой поток SO) заключается в том, что «Нет фундаментальных изменений - это остается вашим лучшим набором альтернатив». – justSteve 2011-03-07 15:35:00

+0

Ниже приведено сообщение, в котором идея RssActionResult немного дополняется обобщенным итоговым классом SyndicationAction, а также фильтром условного фильтра 304 NotModified. http://www.58bits.com/blog/ASPNET-MVC-304-Not-Modified-Filter-For-Syndication-Content.aspx – 2009-07-29 05:36:43

+0

Используя RssToolkit, вам просто нужно иметь один файл .ashx в вашем проекте для генерации RSS корм. Затем вы можете переписать свой URL-адрес на дружественный. Я думаю, что в этом подходе нет ничего против MVC. – 2008-11-12 19:43:25

ответ

62

Вот что я рекомендую:

  1. Создайте класс RssResult, что наследует от абстрактного базового класса ActionResult.
  2. Переопределить метод ExecuteResult.
  3. ExecuteResult имеет ControllerContext, переданный ему вызывающим абонентом, и с этим вы можете получить данные и тип контента.
  4. Как только вы измените тип контента на rss, вам нужно будет сериализовать данные в RSS (используя собственный код или другую библиотеку) и написать ответ.

  5. Создайте действие на контроллере, который вы хотите вернуть rss, и установите тип возврата как RssResult. Возьмите данные из своей модели, основываясь на том, что вы хотите вернуть.

  6. Тогда любой запрос на это действие получит rss любых данных, которые вы выберете.

Это, вероятно, самый быстрый и многоразовый способ возврата. Rss имеет ответ на запрос в ASP.NET MVC.

12

Другой сумасшедший подход, но имеет свое преимущество, заключается в том, чтобы использовать обычный вид .aspx для рендеринга RSS. В своем методе действий просто установите соответствующий тип содержимого. Одно из преимуществ этого подхода заключается в том, что легко понять, что делается, и как добавлять настраиваемые элементы, такие как геолокация.

С другой стороны, другие подходы могут быть лучше, я просто не использовал их. ;)

34

Я согласен с Haacked. Я в настоящее время реализую свой сайт/блог с помощью рамки MVC, и я пошел с простым подходом создания нового View для RSS:

<%@ Page ContentType="application/rss+xml" Language="C#" AutoEventWireup="true" CodeBehind="PostRSS.aspx.cs" Inherits="rr.web.Views.Blog.PostRSS" %><?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"> 
<channel> 
<title>ricky rosario's blog</title> 
<link>http://<%= Request.Url.Host %></link> 
<description>Blog RSS feed for rickyrosario.com</description> 
<lastBuildDate><%= ViewData.Model.First().DatePublished.Value.ToUniversalTime().ToString("r") %></lastBuildDate> 
<language>en-us</language> 
<% foreach (Post p in ViewData.Model) { %> 
    <item> 
    <title><%= Html.Encode(p.Title) %></title> 
    <link>http://<%= Request.Url.Host + Url.Action("ViewPostByName", new RouteValueDictionary(new { name = p.Name })) %></link> 
    <guid>http://<%= Request.Url.Host + Url.Action("ViewPostByName", new RouteValueDictionary(new { name = p.Name })) %></guid> 
    <pubDate><%= p.DatePublished.Value.ToUniversalTime().ToString("r") %></pubDate> 
    <description><%= Html.Encode(p.Content) %></description> 
    </item> 
<% } %> 
</channel> 
</rss> 

Для получения дополнительной информации, проверьте (бесстыдный штепсель) http://rickyrosario.com/blog/creating-an-rss-feed-in-asp-net-mvc

147

.NET framework предоставляет классы, которые обрабатывают синдикаты: SyndicationFeed и т. Д. Итак, вместо того, чтобы делать рендеринг самостоятельно или использовать какую-то другую предложенную библиотеку RSS, почему бы не позволить этой структуре позаботиться об этом?

В основном вам просто нужно следующее пользовательское ActionResult, и вы готовы пойти:

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)) 
     { 
      rssFormatter.WriteTo(writer); 
     } 
    } 
} 

Теперь в вашем действии контроллера вы можете просто вернуть следующее:

return new RssActionResult() { Feed = myFeedInstance }; 

Там в полный образец в моем блоге на http://www.developerzen.com/2009/01/11/aspnet-mvc-rss-feed-action-result/

7

Я получил это от Эрана Кампфа и Скотта Гензельмана (забыл ссылку), так что он немного отличается от сома Другие сообщения здесь, но, надеюсь, полезны и скопируйте пасту в качестве примера rss-канала.

From my blog

Eran Kampf

using System; 
using System.Collections.Generic; 
using System.ServiceModel.Syndication; 
using System.Web; 
using System.Web.Mvc; 
using System.Xml; 

namespace MVC3JavaScript_3_2012.Rss 
{ 
    public class RssFeed : FileResult 
    { 
     private Uri _currentUrl; 
     private readonly string _title; 
     private readonly string _description; 
     private readonly List<SyndicationItem> _items; 

     public RssFeed(string contentType, string title, string description, List<SyndicationItem> items) 
      : base(contentType) 
     { 
      _title = title; 
      _description = description; 
      _items = items; 
     } 

     protected override void WriteFile(HttpResponseBase response) 
     { 
      var feed = new SyndicationFeed(title: this._title, description: _description, feedAlternateLink: _currentUrl, 
              items: this._items); 
      var formatter = new Rss20FeedFormatter(feed); 
      using (var writer = XmlWriter.Create(response.Output)) 
      { 
       formatter.WriteTo(writer); 
      } 
     } 

     public override void ExecuteResult(ControllerContext context) 
     { 
      _currentUrl = context.RequestContext.HttpContext.Request.Url; 
      base.ExecuteResult(context); 
     } 
    } 
} 

И код контроллера ....

[HttpGet] 
public ActionResult RssFeed() 
{ 
    var items = new List<SyndicationItem>(); 
    for (int i = 0; i < 20; i++) 
    { 
     var item = new SyndicationItem() 
     { 
      Id = Guid.NewGuid().ToString(), 
      Title = SyndicationContent.CreatePlaintextContent(String.Format("My Title {0}", Guid.NewGuid())), 
      Content = SyndicationContent.CreateHtmlContent("Content The stuff."), 
      PublishDate = DateTime.Now 
     }; 
     item.Links.Add(SyndicationLink.CreateAlternateLink(new Uri("http://www.google.com")));//Nothing alternate about it. It is the MAIN link for the item. 
     items.Add(item); 
    } 

    return new RssFeed(title: "Greatness", 
         items: items, 
         contentType: "application/rss+xml", 
         description: String.Format("Sooper Dooper {0}", Guid.NewGuid())); 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^