.NET Core Tipp: RSS-Feed erstellen

Im klassischen .NET Framework war es mit wenig Aufwand möglich einen RSS-Feed zu erstellen. Die alte Webseite der .NET User Group Bern nutzte diesen Ansatz auch zur Ankündigung kommender Veranstaltungen.

Den Veranstaltungsfeed erstellten wir damals aufgrund diverser Rückmeldungen. Es gab Community-Mitglieder die wollten keinen XING-Account erstellen, um informiert zu werden. Mit unseren RSS-Feed konnten sie sich über aktuelle Veranstaltungen informieren lassen und sich mittels Kontaktformular anmelden.

Mit Meetup, so dachten wir, sei diese Funktionalität nicht mehr nötig. Wir bekamen jedoch Rückmeldungen, sodass wir den RSS-Feed auf Basis von .NET Core wieder zur Verfügung stellen.

Problem

Wie können wir Community-Mitglieder informieren, die sich nicht auf Plattformen wie Xing, LinkedIn oder Meetup registrieren wollen?

Aktion

Damit die Klasse SyndicationFeed in .NET Core verwendbar ist, muss zuerst das NuGet-Paket System.ServiceModel.Syndication hinzugefügt werden.

install-package System.ServiceModel.Syndication

Wenn das Paket erfolgreich hinzugefügt wurde, steht die Klasse SyndicationFeed zur Verfügung.

In einem nächsten Schritt erweitern wir unseren Controller mit einer RSS-Action.

[HttpGet]
[ResponseCache(Duration = 1200)]
public async Task<IActionResult> Rss()
{
        var veranstaltungen = await _veranstaltungAuskunftsdienst.GibVeranstaltungenAsync();
        var feed = new SyndicationFeed("Veranstaltungen .NET User Group Bern", "Wir sind eine Gemeinschaft in der Region Bern, in der sich .NET Interessierte regelmässig treffen.", new Uri("https://www.dnug-bern.ch"), "RSSUrl", DateTime.Now);
        feed.Copyright = new TextSyndicationContent($"{DateTime.Now.Year} .NET User Group Bern");
        var items = new List<SyndicationItem>();
        foreach (var item in veranstaltungen)
        {
            var postUrl = Url.Action("Index", "Detail", new { area = "Veranstaltungen", code = item.Code }, HttpContext.Request.Scheme);
            var synitm = new SyndicationItem(item.Titel, item.Teaser, new Uri(postUrl), item.Code, item.Beginn);
            synitm.Categories.Add(new SyndicationCategory(item.IstVeranstaltungshinweis ? ".NET User Group Bern Veranstaltungshinweis": ".NET User Group Bern Treffen"));
            synitm.PublishDate = item.Beginn;
            items.Add(synitm);
       }

        feed.Items = items;
        var settings = new XmlWriterSettings
        {
            Encoding = Encoding.UTF8,
            NewLineHandling = NewLineHandling.Entitize,
            NewLineOnAttributes = true,
            Indent = true
        };

        await using var stream = new MemoryStream();
        using (var xmlWriter = XmlWriter.Create(stream, settings))
        {
            var rssFormatter = new Rss20FeedFormatter(feed, false);
            rssFormatter.WriteTo(xmlWriter);
            xmlWriter.Flush();
        }

        return File(stream.ToArray(), "application/rss+xml; charset=utf-8");
}

Beim Aufruf werden die Veranstaltungen nun auch als RSS ausgegeben.

Die Abbildung zeigt einen Ausschnitt des RSS Feed der .NET User Group Bern

Resultat

Die Veranstaltungen stehen als RSS-Feed zur Verfügung und können abonniert werden. So können sich auch Community-Mitglieder über Veranstaltungen informieren lassen, die sich lieber über unser Kontaktformular anmelden wollen.

Beispielsweise kann dieser Feed in Outlook über RSS-Abonnements hinzugefügt werden.

Abbildung zeigt einen Ausschnitt der Veranstaltungen in Microsoft Outlook. Der Benutzer entscheidet so, ob und in welchen Umfang er informiert werden will.