# Hinzufügen eines RSS-Feeds mit ASPA.-NET Core

<!--category-- ASP.NET, RSS -->
<datetime class="hidden">2024-08-07T13:53</datetime>

## Einleitung

RSS und Atom-) ist immer noch das einzige weit verbreitete Format, um Inhalte zu syndizieren.. ist ein einfaches XML-Format, das von einer Vielzahl von Feed-Readern verbraucht werden kann In diesem Beitrag zeigen ,, wie Sie einen RSS-Feed in Ihre ASP-MSC7,NET Core Anwendung hinzufügen können.MSC8

[TOC]

## Erstellen des Feeds

Wirklich der Kern davon ist die Erstellung des XML-Dokuments für den RSS-Feed.
Der folgende Code enthält eine Liste von `RssFeedItem` objects und erzeugt das XML für den feed- `RssFeedItem` class ist eine einfache Klasse, die ein Element im feed darstellt.Es hat Eigenschaften für den Titel.

```csharp
    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());
        }
    }
```

Dinge der Notiz im Code oben.
Wir müssen den Atom Namespace erstellen und ihn in das XML-Dokument einspritzen, um die `atom:link` Element„."

```csharp
     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-Kodierung

Obwohl wir angeben, `utf-8` Hier gut ASP-.-NET Core ignoriert, dass die Zeichenfolgen im Dokument tatsächlich UTF-MSC4 erzeugt Ich hatte gedacht, dass

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

```

Aber wir müssen dies tun

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

Auf diese Weise gibt es ein XML-Dokument mit utf.-8-Codierung aus.

## Der Controller

Von dort aus ist es ziemlich einfach im RSSController. Wir haben eine Methode, die akzeptiert `category` und `startdate` Aktuell ein super Geheimfeature und gibt den Feed zurück.

```csharp
    [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);
    }
```

DANN in der "MSA"_Layout - .-cshtml - Wir fügen einen Link zum Feed hinzu.

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

Dies stellt sicher, dass der Feed von den Futterlesern automatisch entdeckt werden kann.