RSS ASP.NET MVC में फ़ीड करता है


113

आप ASP.NET MVC में RSS फ़ीड्स से निपटने के लिए कैसे करेंगे? किसी तीसरे पक्ष के पुस्तकालय का उपयोग करना? BCL में RSS सामान का उपयोग? बस एक आरएसएस विचार बना रहा है जो एक्सएमएल को प्रस्तुत करता है? या कुछ और पूरी तरह से अलग?


आरएसएस फ़ीड उत्पन्न करने के लिए RssToolkit का उपयोग करके आपको बस अपनी परियोजना में एक .ashx फ़ाइल रखने की आवश्यकता है। तब आप इसके URL को एक फ्रेंडली रीराइट कर सकते हैं। मुझे लगता है कि इस दृष्टिकोण में एमवीसी के खिलाफ कुछ भी नहीं है।
महदी तागिज़ादेह

यहाँ एक अनुवर्ती पोस्ट है जो एक सामान्यकृत सिंडिकेशनएक्शन परिणाम वर्ग के साथ-साथ एक 304 NotModified सशर्त फ़िल्टर प्राप्त करने के साथ RssActionResult विचार को थोड़ा आगे ले जाता है। 58bits.com/blog/…
ब्लू वाटर्स

मैंने RssResult लिखा है, जिसे आप पसंद कर सकते हैं। यह आपकी आवश्यकताओं को पूरा करना चाहिए http://www.wduffy.co.uk/blog/rssresult-aspnet-mvc-rss-actionresult/
डब्ल्यूडीएफ

1
पिछले संपादन के 18 महीने बाद ही इस सवाल को अपडेट करने के लिए - यह सवाल उचित लग रहा था कि 'पुनरावृत्तियों के साथ चीजें बदल गई हैं। नेट और पीवीसी दोनों ही बदल जाएंगे कि हम फ़ीड प्रबंधन की समस्या से कैसे निपटेंगे'? आम सहमति (एक अलग SO थ्रेड के माध्यम से) यह है कि, 'कोई मौलिक परिवर्तन नहीं - यह आपके विकल्पों का सबसे अच्छा सेट बना हुआ है।'
JustSteve

ASP.NET MVC के लिए बुरा सुझाव।
tugberk

जवाबों:


64

यहाँ मेरा सुझाव है:

  1. RssResult नामक एक क्लास बनाएं, जो एब्सट्रैक्ट बेस क्लास ActionResult से विरासत में मिला है।
  2. ExecuteResult विधि को ओवरराइड करें।
  3. ExecuteResult के पास कॉलगर्ल द्वारा कंट्रोलर कॉन्टेक्स्ट पास किया गया है और इसके साथ आप डेटा और सामग्री प्रकार प्राप्त कर सकते हैं।
  4. एक बार जब आप सामग्री प्रकार को rss में बदल देते हैं, तो आप RSS (अपने स्वयं के कोड या किसी अन्य लाइब्रेरी का उपयोग करके) में डेटा को क्रमबद्ध करना चाहेंगे और प्रतिक्रिया को लिखेंगे।

  5. एक नियंत्रक पर एक क्रिया बनाएँ जिसे आप rss वापस करना चाहते हैं और RssResult के रूप में रिटर्न प्रकार सेट करें। अपने मॉडल से उस डेटा को पकड़ो जो आप वापस करना चाहते हैं।

  6. फिर इस कार्रवाई के लिए किसी भी अनुरोध को आप जो भी डेटा चुनते हैं, उसका आरएसएस प्राप्त करेगा।

यह संभवत: rss वापस करने का सबसे तेज और पुन: प्रयोज्य तरीका है। ASP.NET MVC के अनुरोध का जवाब है।


10
हंसेलमैन के पास एक समान समाधान है (वीडियो: 41 मीटर के आसपास शुरू) जहां वह फाइलएंड्टल से विरासत में मिला है। ऐसा करने से, आप अपने वर्ग के निर्माता को कॉल कर सकते हैं base("application/rss+xml")और चरण 3 और 4 से बच सकते हैं । वह ExecuteResult को ओवरराइड करता है, लेकिन यह महत्वपूर्ण नहीं है। उन्होंने यह भी आम तौर पर-पहनें कोड का एक बहुत शॉर्टकट और की 3.5+ सुविधाओं का उपयोग करता SyndicateItem, SyndicateFeedहै, और Rss20FeedFormatter
Patridge

@ डेल: क्या यह संभव है कि जब आप किसी आंशिक दृश्य को फीड करना चाहते हैं तो प्रतिक्रिया लिखना संभव है? धन्यवाद।
ईसाई

1
मेरी पूर्व टिप्पणी से हंसेलमैन के वीडियो का अपडेट किया गया लिंक ।
Patridge

150

.NET फ्रेमवर्क उन कक्षाओं को उजागर करता है जो सिंडिकेशन को संभालते हैं: सिंडिकेशनफीड आदि। इसलिए खुद को रेंडर करने या कुछ अन्य सुझाए गए आरएसएस लाइब्रेरी का उपयोग करने के बजाय फ्रेमवर्क का ख्याल क्यों नहीं रखना चाहिए?

मूल रूप से आपको केवल निम्नलिखित कस्टम क्रिया की आवश्यकता है और आप जाने के लिए तैयार हैं:

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

मैं हैक्ड से सहमत हूं। मैं वर्तमान में एमवीसी ढांचे का उपयोग करके अपनी साइट / ब्लॉग को लागू कर रहा हूं और मैं आरएसएस के लिए एक नया दृष्टिकोण बनाने के सरल दृष्टिकोण के साथ गया:

<%@ 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
रेजर उपयोग के लिए: @model PageModel @ {Response.ContentType = "एप्लीकेशन / आरएसएस + एमएक्स"; } <? xml संस्करण = "1.0" एन्कोडिंग = "UTF-8"?>
एंथनी जॉनसन

2
क्या उपरि? आप इस तथ्य का मतलब है कि आप एक ही बात को अधिक पठनीय तरीके से पूरा करने के लिए कम कोड लिख रहे हैं?
पॉल

12

एक अन्य पागल दृष्टिकोण, लेकिन इसका लाभ है, आरएसएस को प्रस्तुत करने के लिए एक सामान्य .aspx दृश्य का उपयोग करना है। अपनी कार्रवाई विधि में, बस उपयुक्त सामग्री प्रकार सेट करें। इस दृष्टिकोण का एक लाभ यह समझना आसान है कि क्या प्रस्तुत किया जा रहा है और जियोलोकेशन जैसे कस्टम तत्वों को कैसे जोड़ा जाए।

फिर, सूचीबद्ध अन्य दृष्टिकोण बेहतर हो सकते हैं, मैंने अभी उनका उपयोग नहीं किया है। ;)


3
@ हएकेड: दुनिया एक अमान्य आरएसएस एक्सएमएल से भरी है जो एक टेम्प्लेटिंग सिस्टम द्वारा निर्मित है। कृपया मेस में न जोड़ें! रिकी, HTML एन्कोडिंग! = XML एन्कोडिंग।
ब्रैड विल्सन

नीचे MSDN से Html Encode का प्रलेखन है:> वर्तमान कार्यान्वयन विवरणों के कारण, इस फ़ंक्शन का उपयोग xmlEncode फ़ंक्शन के रूप में किया जा सकता है। वर्तमान में, इस फ़ंक्शन द्वारा उपयोग की जाने वाली सभी नामित इकाइयां भी xml पूर्वनिर्धारित नाम वाली संस्थाएं हैं। वे हैं <> "और के रूप में है & lt इनकोडिंग; & gt; & quot; और & amp ;. अन्य संस्थाओं की तरह और दशमलव-इनकोड # 160 ;. http://msdn.microsoft.com/en-us/library/73z22y6h.aspx
रिकी

आप यह कैसे सुनिश्चित कर सकते हैं कि XML इस तरह से वैध है? यह अच्छा होगा यदि एक्सएमएल दृश्य बनाने के लिए आने वाले वेब अनुरोध से व्यू रेंडरिंग को डिकॉउल्ड किया गया, या संभवत: रेल पर रूबी जैसे ईमेल टेम्प्लेट किए गए।
पचो

व्यू इंजन का उपयोग करने के बजाय, आप एक RssResult बना सकते हैं जो ActionResult से प्राप्त होता है। हम इसे JsonResult के साथ करते हैं जो JSON के ऑब्जेक्ट को क्रमबद्ध करता है। आपके मामले में, आपको कुछ सीरियलाइज़र मिलेंगे (मुझे लगता है कि WCF के पास एक है) जो कि आरएसएस को नागरीकृत करता है।
हेक किया गया

8

मुझे यह एरण कैम्फ और एक स्कॉट हैन्समैन 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()));

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.