Back to "RSS-feed toevoegen met ASP.NET Core"

This is a viewer only at the moment see the article on how this works.

To update the preview hit Ctrl-Alt-R (or ⌘-Alt-R on Mac) or Enter to refresh. The Save icon lets you save the markdown file to disk

This is a preview from the server running through my markdig pipeline

ASP.NET RSS

RSS-feed toevoegen met ASP.NET Core

Wednesday, 07 August 2024

Inleiding

RSS ( en Atom) is nog steeds het enige geaccepteerde formaat voor syndicatie van inhoudM SK2 HetMSC3 is een eenvoudig XML-format dat kan worden verbruikt door een groot aantal voerlezers.

Het creëren van de voer

De kern hiervan is het maken van het XML-document voor de RSS-feed. De code onder neemt een lijst van: RssFeedItem objecten en genereert de XML voor het feed. De RssFeedItem class is een eenvoudige klas die een item in de feed vertegenwoordigt. Het heeft eigenschappen voor de titelMSC1 link, beschrijvingM SK3 publicatiedatumMska4 en categorieënMske5

    public string GenerateFeed(IEnumerable<RssFeedItem> items, string categoryName = "")
    {
        XNamespace atom = "http://www.w3.org/2005/Atom";
        var feed = new XDocument(
            new XDeclaration("1.0", "utf-8", null),
            new XElement("rss",    new XAttribute(XNamespace.Xmlns + "atom", atom.NamespaceName), new XAttribute("version", "2.0"),
                new XElement("channel",
                    new XElement("title", !string.IsNullOrEmpty(categoryName) ? $"mostlylucid.net for {categoryName}" : $"mostlylucid.net"),
                    new XElement("link", $"{GetSiteUrl()}/rss"),
                    new XElement("description", "The latest posts from mostlylucid.net"),
                    new XElement("pubDate", DateTime.UtcNow.ToString("R")),
                    new XElement(atom + "link", 
                        new XAttribute("href", $"{GetSiteUrl()}/rss"), 
                        new XAttribute("rel", "self"), 
                        new XAttribute("type", "application/rss+xml")),
                    from item in items
                    select new XElement("item",
                        new XElement("title", item.Title),
                        new XElement("link", item.Link),
                        new XElement("guid", item.Guid, new XAttribute("isPermaLink", "false")),
                        new XElement("description", item.Description),
                        new XElement("pubDate", item.PubDate.ToString("R")),
                        from category in item.Categories
                        select new XElement("category", category)
                    )
                )
            )
        );

        var settings = new XmlWriterSettings
        {
            Indent = true,
            Encoding = new UTF8Encoding(false) // UTF-8 without BOM
        };

        using (var memoryStream = new MemoryStream())
        using (var writer = XmlWriter.Create(memoryStream, settings))
        {
            feed.Save(writer);
            writer.Flush();
            return Encoding.UTF8.GetString(memoryStream.ToArray());
        }
    }

Wat er opvalt in de code hierboven: We moeten de Atom-namespace creëren en injecteren in het XML-document om te ondersteunen. atom:link element.

     XNamespace atom = "http://www.w3.org/2005/Atom";
        var feed = new XDocument(
            new XDeclaration("1.0", "utf-8", null),
            new XElement("rss",    new XAttribute(XNamespace.Xmlns + "atom", atom.NamespaceName), new XAttribute("version", "2.0"),

UTF-8 Enkodering

Hoewel we specifiek hebben. utf-8 ASP.NET Core negeert dat, omdat het special is, ...Behalve moeten we ervoor zorgen dat de in het document gegenereerde stringen UTF zijn.

   var settings = new XmlWriterSettings
        {
            Indent = true,
            Encoding = new UTF8Encoding(false) // UTF-8 without BOM
        };

Maar we moeten dit doen.

        using (var memoryStream = new MemoryStream())
        using (var writer = XmlWriter.Create(memoryStream, settings))
        {
            feed.Save(writer);
            writer.Flush();
            return Encoding.UTF8.GetString(memoryStream.ToArray());
        }

Op deze manier geeft het een XML-document uit met utf-8 encodering.

De controller

Van daaruit is ' vrij eenvoudig in de RSSController, we hebben een methode die accepteert. category en startdate (het moment een supergeheime functie ??) en geeft de feed terug

    [HttpGet]
    public IActionResult Index([FromQuery] string category = null, [FromQuery] string startDate = null)
    {
        DateTime? startDateTime = null;
        if (DateTime.TryParseExact(startDate, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None,
                out DateTime startDateTIme))
        {
            logger.LogInformation("Start date is {startDate}", startDate);
        }

        var rssFeed = rssFeedService.GenerateFeed(startDateTime, category);
        return Content(rssFeed, "application/rss+xml", Encoding.UTF8);
    }

Dan in de `._Uitleg.cshtml' we voegen een link toe aan de stroomfeed

        <link rel="alternate" type="application/rss+xml"
              title="RSS Feed for mostlylucid.net"
              href="/rss" />

Dit zorgt ervoor dat de stroom 'autoontdekt kan worden ' door stroomlezers.

logo

© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.