Bạn sẽ đề xuất xử lý Nguồn cấp RSS trong ASP.NET MVC như thế nào? Sử dụng thư viện của bên thứ ba? Sử dụng công cụ RSS trong BCL? Chỉ tạo một dạng xem RSS kết xuất XML? Hay một cái gì đó hoàn toàn khác?
Bạn sẽ đề xuất xử lý Nguồn cấp RSS trong ASP.NET MVC như thế nào? Sử dụng thư viện của bên thứ ba? Sử dụng công cụ RSS trong BCL? Chỉ tạo một dạng xem RSS kết xuất XML? Hay một cái gì đó hoàn toàn khác?
Câu trả lời:
Đây là những gì tôi khuyên bạn nên:
Khi bạn thay đổi loại nội dung thành rss, bạn sẽ muốn tuần tự hóa dữ liệu sang RSS (sử dụng mã của riêng bạn hoặc thư viện khác) và ghi vào phản hồi.
Tạo một hành động trên bộ điều khiển mà bạn muốn trả về rss và đặt kiểu trả về là RssResult. Lấy dữ liệu từ mô hình của bạn dựa trên những gì bạn muốn trả lại.
Sau đó, bất kỳ yêu cầu nào đối với hành động này sẽ nhận được rs của bất kỳ dữ liệu nào bạn chọn.
Đó có lẽ là cách nhanh nhất và có thể tái sử dụng để trả về rss có phản hồi cho một yêu cầu trong ASP.NET MVC.
base("application/rss+xml")
và tránh các bước 3 và 4. Anh ta ghi đè ExecuteResult, nhưng nó không quan trọng. Ông cũng tắt rất nhiều mã thường-dệt ở nhà và sử dụng các tính năng của 3.5+ SyndicateItem
, SyndicateFeed
và Rss20FeedFormatter
.
Khuôn khổ .NET hiển thị các lớp xử lý việc phân phối: SyndicationFeed, v.v. Vì vậy, thay vì tự mình thực hiện việc kết xuất hoặc sử dụng một số thư viện RSS được đề xuất khác, tại sao không để khuôn khổ xử lý nó?
Về cơ bản, bạn chỉ cần ActionResult tùy chỉnh sau đây và bạn đã sẵn sàng:
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);
}
}
}
Bây giờ trong hành động điều khiển của bạn, bạn có thể đơn giản trả lại như sau:
return new RssActionResult() { Feed = myFeedInstance };
Có một mẫu đầy đủ trên blog của tôi tại http://www.developerzen.com/2009/01/11/aspnet-mvc-rss-feed-action-result/
Tôi đồng ý với Haacked. Tôi hiện đang triển khai trang web / blog của mình bằng cách sử dụng khuôn khổ MVC và tôi đã thực hiện với cách tiếp cận đơn giản là tạo Chế độ xem mới cho 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>
Để biết thêm thông tin, hãy xem (phích cắm vô liêm sỉ) http://rickyrosario.com/blog/creating-an-rss-feed-in-asp-net-mvc
Một cách tiếp cận điên rồ khác, nhưng có ưu điểm của nó là sử dụng chế độ xem .aspx bình thường để hiển thị RSS. Trong phương pháp hành động của bạn, chỉ cần đặt loại nội dung thích hợp. Một lợi ích của phương pháp này là dễ dàng hiểu được những gì đang được hiển thị và cách thêm các yếu tố tùy chỉnh như vị trí địa lý.
Sau đó, một lần nữa, các cách tiếp cận khác được liệt kê có thể tốt hơn, chỉ là tôi chưa sử dụng chúng. ;)
Tôi nhận được cái này từ Eran Kampf và một vid của Scott Hanselman (quên liên kết) vì vậy nó chỉ hơi khác so với một số bài đăng khác ở đây, nhưng hy vọng hữu ích và sao chép dán sẵn sàng làm nguồn cấp dữ liệu rss ví dụ.
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);
}
}
}
Và Mã điều khiển….
[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()));
}