Bagaimana Anda merekomendasikan penanganan RSS Feed di ASP.NET MVC? Menggunakan perpustakaan pihak ketiga? Menggunakan barang RSS di BCL? Hanya membuat tampilan RSS yang menampilkan XML? Atau sesuatu yang sama sekali berbeda?
Bagaimana Anda merekomendasikan penanganan RSS Feed di ASP.NET MVC? Menggunakan perpustakaan pihak ketiga? Menggunakan barang RSS di BCL? Hanya membuat tampilan RSS yang menampilkan XML? Atau sesuatu yang sama sekali berbeda?
Jawaban:
Inilah yang saya rekomendasikan:
Setelah Anda mengubah tipe konten menjadi rss, Anda akan ingin membuat serial data ke RSS (menggunakan kode Anda sendiri atau pustaka lain) dan menulis ke respon.
Buat tindakan pada pengontrol yang ingin Anda kembalikan rssnya dan setel jenis kembalian sebagai RssResult. Ambil data dari model Anda berdasarkan apa yang ingin Anda kembalikan.
Kemudian setiap permintaan untuk tindakan ini akan menerima rss data apa pun yang Anda pilih.
Itu mungkin cara tercepat dan dapat digunakan kembali untuk mengembalikan rss memiliki respons terhadap permintaan di ASP.NET MVC.
base("application/rss+xml")
dan menghindari langkah 3 dan 4. Dia menimpa ExecuteResult, tetapi itu tidak penting. Dia juga pintas banyak kode biasanya-tenunan sendiri dan menggunakan 3.5 + fitur SyndicateItem
, SyndicateFeed
dan Rss20FeedFormatter
.
Kerangka .NET memperlihatkan kelas yang menangani sindasi: SyndicationFeed, dll. Jadi, alih-alih melakukan rendering sendiri atau menggunakan beberapa pustaka RSS yang disarankan, mengapa tidak membiarkan kerangka yang mengurusnya?
Pada dasarnya Anda hanya perlu ActionResult kustom berikut dan Anda siap untuk pergi:
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);
}
}
}
Sekarang dalam tindakan pengontrol Anda, Anda dapat mengembalikan yang berikut ini:
return new RssActionResult() { Feed = myFeedInstance };
Ada contoh lengkap di blog saya di http://www.developerzen.com/2009/01/11/aspnet-mvc-rss-feed-action-result/
Saya setuju dengan Haacked. Saat ini saya menerapkan situs / blog saya menggunakan kerangka kerja MVC dan saya menggunakan pendekatan sederhana dalam membuat Tampilan baru untuk 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>
Untuk informasi lebih lanjut, lihat (steker tak tahu malu) http://rickyrosario.com/blog/creating-an-rss-feed-in-asp-net-mvc
Pendekatan gila lainnya, tetapi memiliki keuntungannya, adalah menggunakan tampilan .aspx normal untuk merender RSS. Dalam metode tindakan Anda, cukup setel jenis konten yang sesuai. Satu keuntungan dari pendekatan ini adalah mudah untuk memahami apa yang sedang dirender dan bagaimana menambahkan elemen kustom seperti geolocation.
Kemudian lagi, pendekatan lain yang terdaftar mungkin lebih baik, saya hanya belum menggunakannya. ;)
Saya mendapat ini dari Eran Kampf dan vid Scott Hanselman (lupa tautannya) jadi hanya sedikit berbeda dari beberapa posting lain di sini, tetapi semoga bermanfaat dan siap salin tempel sebagai contoh umpan 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);
}
}
}
Dan Kode Pengontrol ....
[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()));
}