# Προσθήκη RSS feed με ASP.NET Core

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

## Εισαγωγή

RSS ( και AtomΜSK1 εξακολουθεί να είναι η μόνη ευρέως υιοθετημένη μορφή για το συνδετικό περιεχόμενο. ΤοMK3χει μια απλή μορφή XML που μπορεί να καταναλωθεί από ένα ευρύ φάσμα αναγνωστών feedMST4Σε αυτό το postMSM5 θα σας δείξει πώς να προσθέσετε ένα RSS feed στο ASPMSL7NET Core applicationMSS8

[TOC]

## Δημιουργία της τροφής

Στην πραγματικότητα, ο πυρήνας αυτού είναι η δημιουργία του εγγράφου XML για το feed RSS.
Ο κώδικας παρακάτω περιλαμβάνει μια λίστα `RssFeedItem` αντικείμενα και παράγει το XML για το feed. `RssFeedItem` κλάση είναι μια απλή κατηγορία που αντιπροσωπεύει ένα στοιχείο στην ενότητα. Έχει ιδιότητες για τον τίτλοΜSK1 σύνδεσμοςΜΚ2 περιγραφήΜΣΚ3 ημερομηνία δημοσίευσηςΜСК4 και κατηγορίες

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

Σημειώσεις στο κώδικα πάνω:
Πρέπει να δημιουργήσουμε το Atom name space και να το ενέξουμε στο έγγραφο XML για να υποστηρίξουμε την `atom:link` Ετικέτες .

```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` Εδώ καλά ASP.NET Κορυφαία αγνοεί ότι...επειδήΜSK2 ειδικόM SK3 Αντίθετα, πρέπει να διασφαλίσουμε ότι οι αλυσίδες που παράγονται στο έγγραφο είναι πραγματικά UTF ΜSK4 είχα σκεφτεί αυτό

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

```

Ωστόσο, η NOPE...χρειάζεται να το κάνει αυτόΜSK1

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

Με αυτόν τον τρόπο εκπέμπει ΣΗΜΕΡΑ ένα έγγραφο XML με utf-8 κρυπτογράφηση.

## Ο ελεγκτής

Από εκεί και πέρα, το ' είναι αρκετά απλό στο RSSController για το , αλλά έχουμε μια μέθοδο που αποδέχεται `category` και `startdate` ( επί του παρόντος ένα υπερ-κρυφό χαρακτηριστικό Η ??) αναφέρει και επιστρέφει το feedΗ ΜSK2 αναφέρει

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

ΤΙ ΕΙΝΑΙ ΣΤΗΝ `_Σχεδιασμός.cshtmlΜSK1 προσθέτουμε έναν σύνδεσμο στο feed:

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

Αυτό εξασφαλίζει ότι η τροφή μπορεί να είναι 'ΑυτοανακαλύφθηκεΜSK1 από τους αναγνώστες τροφίμων ΜSK2