当前位置:  开发笔记 > 编程语言 > 正文

ASP.NET MVC中的RSS源

如何解决《ASP.NETMVC中的RSS源》经验,为你挑选了5个好方法。

您如何推荐在ASP.NET MVC中处理RSS Feeds?使用第三方库?使用BCL中的RSS东西?只是制作一个呈现XML的RSS视图?还是完全不同的东西?



1> Eran Kampf..:

.NET框架公开了处理syndation的类: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/



2> Dale Ragan..:

这是我的建议:

    创建一个名为RssResult的类,它继承了抽象基类ActionResult.

    重写ExecuteResult方法.

    ExecuteResult具有由调用者传递给它的ControllerContext,您可以使用它来获取数据和内容类型.

    将内容类型更改为rss后,您需要将数据序列化为RSS(使用您自己的代码或其他库)并写入响应.

    在要返回rss的控制器上创建一个操作,并将返回类型设置为RssResult.根据您要返回的内容从模型中获取数据.

    然后,对此操作的任何请求都将收到您选择的任何数据的rs.

这可能是返回rss的最快和可重用的方式,它对ASP.NET MVC中的请求有响应.


Hanselman有一个[类似的解决方案](http://live.visitmix.com/MIX10/Sessions/FT07)(视频:从41米左右开始),他从FileResult继承.通过这样做,你可以让你的类的构造函数调用`base("application/rss + xml")`并避免步骤3和4.他确实覆盖了ExecuteResult,但它并不重要.他还快速删除了许多典型的homespun代码,并使用了`SyndicateItem`,`SyndicateFeed`和`Rss20FeedFormatter`的3.5+特性.

3> Ricky..:

我同意Haacked.我目前正在使用MVC框架实现我的网站/博客,我采用了创建新的RSS视图的简单方法:

<%@ Page ContentType="application/rss+xml" Language="C#" AutoEventWireup="true" CodeBehind="PostRSS.aspx.cs" Inherits="rr.web.Views.Blog.PostRSS" %>


ricky rosario's blog
http://<%= Request.Url.Host %>
Blog RSS feed for rickyrosario.com
<%= ViewData.Model.First().DatePublished.Value.ToUniversalTime().ToString("r") %>
en-us
<% foreach (Post p in ViewData.Model) { %>
    
    <%= Html.Encode(p.Title) %>
    http://<%= Request.Url.Host + Url.Action("ViewPostByName", new RouteValueDictionary(new { name = p.Name })) %>
    http://<%= Request.Url.Host + Url.Action("ViewPostByName", new RouteValueDictionary(new { name = p.Name })) %>
    <%= p.DatePublished.Value.ToUniversalTime().ToString("r") %>
    <%= Html.Encode(p.Content) %>
    
<% } %>


有关更多信息,请查看(无耻插件)http://rickyrosario.com/blog/creating-an-rss-feed-in-asp-net-mvc


使用Razor:@model PageModel @ {Response.ContentType ="application/rss + xml"; } <?xml version ="1.0"encoding ="UTF-8"?>
什么开销?你的意思是你写的代码更少,以更易读的方式完成同样的事情?

4> Haacked..:

另一个疯狂的方法,但有其优势,是使用正常的.aspx视图来呈现RSS.在您的操作方法中,只需设置适当的内容类型即可.这种方法的一个好处是很容易理解渲染的内容以及如何添加地理定位等自定义元素.

然后,列出的其他方法可能会更好,我只是没有使用它们.;)


@Haacked:世界充满了由模板系统生成的无效RSS XML.请不要加入乱七八糟的东西!Ricky,HTML编码!= XML编码.

5> TheDev6..:

我从Eran Kampf和Scott Hanselman vid那里得到了这个(忘了链接)所以它与这里的其他一些帖子略有不同,但希望有用并复制粘贴准备作为示例rss feed.

来自我的博客

伊兰·坎普夫

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 _items;

        public RssFeed(string contentType, string title, string description, List 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();
    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()));

}

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有