คุณจะแนะนำการจัดการ RSS Feeds ใน ASP.NET MVC ได้อย่างไร ใช้ไลบรารีของบุคคลที่สาม? ใช้ RSS stuff ใน BCL หรือไม่? เพียงแค่สร้างมุมมอง RSS ที่แสดง XML? หรือสิ่งที่แตกต่างอย่างสิ้นเชิง?
คุณจะแนะนำการจัดการ RSS Feeds ใน ASP.NET MVC ได้อย่างไร ใช้ไลบรารีของบุคคลที่สาม? ใช้ RSS stuff ใน 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 framework จะแสดงคลาสที่จัดการ syndation: SyndicationFeed เป็นต้นดังนั้นแทนที่จะทำการเรนเดอร์ด้วยตัวเองหรือใช้ไลบรารี RSS อื่น ๆ ที่แนะนำทำไมไม่ปล่อยให้ Framework ดูแลมันล่ะ?
โดยพื้นฐานแล้วคุณต้องมี 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 และฉันใช้วิธีง่ายๆในการสร้าง 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
อีกวิธีหนึ่งที่บ้าคลั่ง แต่มีข้อได้เปรียบคือการใช้มุมมอง. 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()));
}