Як би ви рекомендували обробляти RSS-канали в ASP.NET MVC? Використовуєте сторонню бібліотеку? Використовуєте RSS-матеріали в BCL? Просто робиться перегляд RSS, який надає XML? Або щось зовсім інше?
Як би ви рекомендували обробляти RSS-канали в ASP.NET MVC? Використовуєте сторонню бібліотеку? Використовуєте RSS-матеріали в BCL? Просто робиться перегляд RSS, який надає XML? Або щось зовсім інше?
Відповіді:
Ось що я рекомендую:
Після зміни типу вмісту на rss, ви захочете серіалізувати дані до RSS (використовуючи власний код або іншу бібліотеку) і написати відповідь.
Створіть дію на контролері, якому потрібно повернути rss, і встановіть тип повернення як RssResult. Візьміть дані з вашої моделі на основі того, що ви хочете повернути.
Тоді будь-який запит на цю дію отримає rss будь-яких даних, які ви обрали.
Це, мабуть, найшвидший і багаторазовий спосіб повернення rss має відповідь на запит в ASP.NET MVC.
base("application/rss+xml")
і уникати кроків 3 і 4. Він переосмислює ExecuteResult, але це не є життєво важливим. Він також ярлики багато типово домотканого коду і використовує 3.5+ особливості SyndicateItem
, SyndicateFeed
і Rss20FeedFormatter
.
Структура .NET розкриває класи, які обробляють синдикацію: 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/
Я згоден з Haacked. Наразі я реалізую свій сайт / блог за допомогою MVC фрейму, і я пішов з простим підходом до створення нового Погляду для 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
Ще один шалений підхід, але має свою перевагу, полягає у використанні нормального перегляду .aspx для візуалізації RSS. У своєму способі дії просто встановіть відповідний тип вмісту. Одна з переваг такого підходу - це легко зрозуміти, що відображається, і як додати спеціальні елементи, такі як геолокація.
Потім знову можуть бути кращі інші перелічені підходи, я просто не використовував їх. ;)
Я отримав це від Eran Kampf та Scott Hanselman vid (забув посилання), тому він лише трохи відрізняється від деяких інших публікацій тут, але, сподіваємось, корисний і скопіюйте готову пасту як приклад RSS-каналу.
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()));
}