Хорошая и полная реализация RSS-каналов в ASP.net MVC

Я видел несколько примеров RSS - каналы в ASP.NET MVC, как это , и некоторые образцы в проектах (например , Oxite), но ни один из них не являются полными.

Например. Никто из них не проверяет заголовок

  If-Modified-Since

в запросе, чтобы сохранить пропускную способность.

Я не хочу изобретать велосипед, поэтому я останавливаюсь здесь, спрашивая некоторые направления.

15.12.2008 21:37:19
3 ОТВЕТА

Я не видел, чтобы он реализовывал HTTP_IF_MODIFIED_SINCE, но я хотел бы изучить использование класса SyndicationFeed. Это позволяет очень просто обрабатывать каналы без разбора. В настоящее время я использую его для каналов Atom, но он должен работать и для RSS:

function SyndicationFeed GetFeed(string url) {
  XmlReader reader = XmlReader.Create(url);
  SyndicationFeed feed = SyndicationFeed.Load(reader);
  return feed;
}

public ActionResult ShowFeed()
{
  string feedUrl = "somefeedurl";
  SyndicationFeed feed = GetFeed(feedUrl);
  return View(feed);
}

... тогда в представлении:

  <%foreach (var item in ViewData.Model.Items) { %>
    <li><a href="<%=item.Id %>"><%=item.Title.Text %></a></li>
  <% } %>
4
16.12.2008 06:07:48
PS Класс находится в сборке System.ServiceModel.Web
Trevor de Koekkoek 15.12.2008 23:05:19
Ваше решение для потребления кормов, а не публикации (как и просили)
Eduardo Molteni 7.07.2009 12:57:27
Получение этой ошибки в поле зрения. CS1061: «объект» не содержит определения для «Элементы», и не может быть найден метод расширения «Элементы», принимающий первый аргумент типа «объект» (отсутствует директива using или ссылка на сборку?)
coure2011 15.05.2010 11:11:39
РЕШЕНИЕ

Я закончил с этим. Пожалуйста, прокомментируйте или отредактируйте сообщение, если вы найдете какую-либо ошибку или лучший способ сделать это.

RssController

Imports System.ServiceModel.Syndication
Imports System.Xml
Imports System.Web.HttpContext

Function MasterRSS()
    Dim baseURL As String = "http://www.mysite.com"
    Dim feed As New SyndicationFeed("MySite - Master RSS", "", New Uri(baseURL))
    ''//Add a custom attribute.
    Dim xqName As New XmlQualifiedName("CustomAttribute")
    feed.AttributeExtensions.Add(xqName, "Value")

    Dim sp As New SyndicationPerson("jerry@mysite.com", "Jerry Seinfeld", "http://Jerry.blog.com")
    feed.Authors.Add(sp)

    Dim category As New SyndicationCategory("Category")
    feed.Categories.Add(category)

    feed.Contributors.Add(New SyndicationPerson("cosmo@mysite.com", "Cosmo Kramer", "http://kramer.blog.com"))
    feed.Copyright = New TextSyndicationContent("MySite 2008")
    feed.Description = New TextSyndicationContent("My description")

    ''//Add a custom element.
    Dim doc As New XmlDocument()
    Dim feedElement As XmlElement = doc.CreateElement("CustomElement")
    feedElement.InnerText = "Some text"
    feed.ElementExtensions.Add(feedElement)

    feed.Generator = "Custom"
    feed.Id = "MySiteFeedID"
    feed.ImageUrl = New Uri("http://www.mysite.com/content/images/logo.png")

    ''//Items
    Dim ModifiedSince As Date
    If Not Date.TryParse(Current.Request.Headers("If-Modified-Since"), ModifiedSince) Then
        ModifiedSince = Date.Today.AddDays(-30) ''//Or whatever make sense to you.         
    Else
        ModifiedSince.AddMinutes(-5) ''//Just in case, we do not want to miss any item. 
    End If

    ''//the list of items.
    Dim items As New List(Of SyndicationItem)()


    Dim db As New mainDataContext
    Dim textContent As TextSyndicationContent, Item As SyndicationItem

    ''//Then send the list of post, comments, whatever.
    Dim Posts = (From p In db.Posts Where c.Date >= ModifiedSince Order By p.Date Descending)
    For Each Post In Posts
        Dim sb As New StringBuilder
        sb.AppendFormat("<p>{0}</p>", Post.FullText)
        textContent = New TextSyndicationContent(sb.ToString, TextSyndicationContentKind.Html)
        Item = New SyndicationItem("Post " + Post.PostID.ToString, textContent, New Uri(baseURL + "/Post/View/" + Post.PostID.ToString), "Post" + Post.PostID.ToString, Post.Date)
        items.Add(Item)
    Next


    If items.Count = 0 Then
        ''//send a 304 to the browser.
        Return View("304")
    End If

    feed.Items = items
    feed.Language = "es-ar"
    feed.LastUpdatedTime = (From i In items Select i.LastUpdatedTime Order By LastUpdatedTime Descending).FirstOrDefault

    ''//Not needed in this sample.
    ''//Dim link As New SyndicationLink(New Uri("http://server/link"), "alternate", "Link Title", "text/html", 1000)
    ''//feed.Links.Add(link)

    ViewData("feed") = feed
    Return View("Rss")

End Function

Rss View (rss.aspx)

Dim htmlwriter As System.IO.Stream = Response.OutputStream
Dim rssWriter As System.Xml.XmlWriter = System.Xml.XmlWriter.Create(htmlwriter)
Dim feed As System.ServiceModel.Syndication.SyndicationFeed = ViewData("feed")
Dim rssFormatter As New System.ServiceModel.Syndication.Rss20FeedFormatter(feed)
rssFormatter.WriteTo(rssWriter)
rssWriter.Close()

Таким образом, вы можете повторно использовать вид

2
7.07.2009 12:46:00
Похоже, вы путаете имя переменной сервера с фактическим именем заголовка: Current.Request.Headers ("HTTP_IF_MODIFIED_SINCE") должен быть Current.Request.Headers ("If-Modified-Since")
Duncan Smart 18.12.2008 11:32:54

Если вы используете HttpContext.Response.Cache.SetCacheability, SetExpiresи SetMaxAgeсистема кэширования ASP.NET позаботится об этом за вас - она ​​понимает заголовок If-Modified-Since. Эта запись блога показывает, как вы можете создать Фильтр действий MVC для выполнения необходимых действий в MVC.

2
18.12.2008 11:39:03
Да, но я хочу пойти немного дальше после истечения срока действия кэша и проверить, есть ли новые элементы после If-Modified-Since
Eduardo Molteni 7.07.2009 12:34:04