ASP.NET MVCのRSSフィード


113

ASP.NET MVCでのRSSフィードの処理をどのようにお勧めしますか?サードパーティのライブラリを使用していますか?BCLでRSSを使用していますか?XMLをレンダリングするRSSビューを作成するだけですか?または完全に異なる何か?


RssToolkitを使用する場合、RSSフィードを生成するには、プロジェクトに単一の.ashxファイルを含める必要があります。その後、URLをわかりやすいURLに書き換えることができます。このアプローチでは、MVCに反することは何もないと思います。
Mahdi Taghizadeh 2008年

これは、一般化されたSyndicationAction結果クラスと304 NotModified条件付き取得フィルターを使用して、RssActionResultのアイデアをさらに進めたフォローアップ投稿です。58bits.com/blog/…–
ブルーウォーターズ

必要に応じて確認できるRssResultを作成しました。要件を満たす必要がありますhttp://www.wduffy.co.uk/blog/rssresult-aspnet-mvc-rss-actionresult/
WDuffy

1
最後の編集から18か月の時点でこの質問を更新するだけです-「フィード管理の問題への取り組み方を変更する.netとmvcの両方の反復によって変更されたものがあるか」を質問することは理にかなっているように思われますか?(別のSOスレッドを介した)コンセンサスは、「根本的な変更はありません-これは依然として最良の選択肢のセットです」です。
justSteve

ASP.NET MVCの不適切な提案。
tugberk '18

回答:


64

これが私がお勧めするものです:

  1. 抽象基本クラスActionResultを継承するRssResultというクラスを作成します。
  2. ExecuteResultメソッドをオーバーライドします。
  3. ExecuteResultには、呼び出し側からControllerContextが渡されます。これにより、データとコンテンツタイプを取得できます。
  4. コンテンツタイプをrssに変更したら、データをRSSにシリアル化し(独自のコードまたは別のライブラリを使用)、応答に書き込みます。

  5. rssを返すコントローラーでアクションを作成し、戻り値のタイプをRssResultとして設定します。返すものに基づいてモデルからデータを取得します。

  6. 次に、このアクションへのリクエストは、選択したデータのRSSを受け取ります。

これはおそらく、ASP.NET MVCでrssがリクエストに応答する最も速く再利用可能な方法です。


10
Hanselmanには、FileResultから継承する同様のソリューションがあります(ビデオ:41分頃から開始)。そうすることで、クラスのコンストラクターを呼び出しbase("application/rss+xml")てステップ3と4を回避できます。彼はExecuteResultをオーバーライドしますが、それは重要ではありません。彼はまた、一般的に、手織りのコードの多くをショートカットとの3.5+機能を使用してSyndicateItemSyndicateFeedRss20FeedFormatter
パトリッジ2010

@Dale:部分的なビューにフィードするために出力したい場合、応答に書き込むことは可能ですか?ありがとう。
クリスチャン

1
以前のコメントから、Hanselmanのビデオのリンクを更新しました。
パトリッジ

150

.NETフレームワークは、シンジケーションを処理するクラスを公開します:SyndicationFeedなど。

基本的に、次のカスタム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/の私のブログに完全なサンプルがあります


34

私は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をチェックしてください


4
Razorを使用する場合:@model PageModel @ {Response.ContentType = "application / rss + xml"; } <?xml version = "1.0" encoding = "UTF-8"?>
アンソニージョンストン

2
どんなオーバーヘッド?同じことをより読みやすい方法で実現するために、より少ないコードを書いているということですか?
ポール

12

別のクレイジーなアプローチですが、その利点は、通常の.aspxビューを使用してRSSをレンダリングすることです。アクションメソッドで、適切なコンテンツタイプを設定するだけです。このアプローチの1つの利点は、何がレンダリングされているか、ジオロケーションなどのカスタム要素を追加する方法を簡単に理解できることです。

次に、リストされている他のアプローチの方が良いかもしれません。私はそれらを使用していません。;)


3
@Haacked:世界は、テンプレートシステムによって生成された無効なRSS XMLでいっぱいです。混乱に追加しないでください!Ricky、HTMLエンコーディング!= XMLエンコーディング。
ブラッドウィルソン

以下は、MSDNのHtml Encodeのドキュメントです。>現在の実装の詳細により、この関数はxmlEncode関数として使用できます。現在、この関数で使用されるすべての名前付きエンティティは、xmlの定義済みの名前付きエンティティでもあります。それらは<> "&&lt;&gt;&quot;および&amp;としてエンコードされます。他のエンティティは&#160;のように10進数でエンコードされます。http ://msdn.microsoft.com/en-us/library/73z22y6h.aspx
リッキー

この方法でXMLが有効であることをどのように確認できますか?XMLのビューや、Ruby on Railsのようなメールテンプレートを可能にするために、ビューのレンダリングが着信するWebリクエストから切り離されていると便利です。
Paco

ビューエンジンを使用する代わりに、ActionResultから派生するRssResultを作成できます。これを行うには、オブジェクトをJSONにシリアル化するJsonResultを使用します。あなたの場合、RSSにシリアル化するシリアライザ(WCFにあると思います)を見つけるでしょう。
2008年

8

私はこれを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()));

}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.