Подтвердить что ты не робот

Правильный способ работы с RSS в ASP.NET Core 1.0 RC2

Каков правильный/лучший способ получить данные из RSS-канала, используя ASP.Net Core 1.0 (RC2) в С#.

Я хочу работать с данными в ленте RSS из моего блога Wordpress, который https://blogs.msdn.microsoft.com/martinkearn/feed/

Я знаю, что в ASP.net 4.x вы использовали бы RssReader или SyndicationFeed, но я не могу найти эквивалент для ядра ASP.net.

Это, насколько я понял, возвращает исходный фид, но я не знаю, как извлечь данные из него. Я хочу перечислить элементы и получить title и description от каждого

    var feedUrl = "https://blogs.msdn.microsoft.com/martinkearn/feed/";
    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri(feedUrl);
        var responseMessage = await client.GetAsync(feedUrl);
        var responseString = await responseMessage.Content.ReadAsStringAsync();
    }
4b9b3361

Ответ 1

В соответствии с этот вопрос, System.ServiceModel.Syndication еще не перенесен в ASP.NET Core. В настоящее время это дает вам два варианта:

  • Задайте полную платформу .NET для обеспечения доступа к SyndicationFeed
  • Создайте собственный синтаксический анализатор XML с помощью .NET Core для воспроизведения требуемых функций

Задайте полную платформу .NET

Это, без сомнения, самый простой подход в зависимости от ваших требований.

Если вы будете развертывать только в Windows, вы можете запустить ASP.NET Core поверх платформы .NET 4.X. Чтобы сделать это, обновите свой project.json от чего-то вроде этого

frameworks": {
  "netcoreapp1.0": {
    "imports": [
      "dotnet5.6",
      "dnxcore50",
      "portable-net45+win8"
    ]
  }
}

:

frameworks": {
  "net452": {
     "frameworkAssemblies": {
         "System.ServiceModel": ""
     }
   }
}

Создайте собственный XML-анализатор

Это даст вам максимальную гибкость, поскольку вы все равно сможете запускать кросс-платформу с использованием платформы .NET Core. Это требует немного больше работы для десериализации строки, которую вы уже получили, но есть много примеров того, как это сделать, например. http://www.anotherchris.net/csharp/simplified-csharp-atom-and-rss-feed-parser/

Ответ 2

Для полноты я включу окончательный код, который является урезанной версией примера @Sock, связанного с разделом ответа "Создайте свой собственный XML-парсер". @Sock ответ по-прежнему является самым полным ответом, но этот пример должен быть полезен для всех, кто ищет быстрый простой пример кода для ядра ASP.NET.

Model

public class FeedItem
{
    public string Link { get; set; } 
    public string Title { get; set; } 
    public string Content { get; set; } 
    public DateTime PublishDate { get; set; } 
}

контроллер

public class ArticlesController : Controller
{
    public async Task<IActionResult> Index()
    {
        var articles = new List<FeedItem>();
        var feedUrl = "https://blogs.msdn.microsoft.com/martinkearn/feed/";
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri(feedUrl);
            var responseMessage = await client.GetAsync(feedUrl);
            var responseString = await responseMessage.Content.ReadAsStringAsync();

            //extract feed items
            XDocument doc = XDocument.Parse(responseString);
            var feedItems = from item in doc.Root.Descendants().First(i => i.Name.LocalName == "channel").Elements().Where(i => i.Name.LocalName == "item")
                            select new FeedItem
                            {
                                Content = item.Elements().First(i => i.Name.LocalName == "description").Value,
                                Link = item.Elements().First(i => i.Name.LocalName == "link").Value,
                                PublishDate = ParseDate(item.Elements().First(i => i.Name.LocalName == "pubDate").Value),
                                Title = item.Elements().First(i => i.Name.LocalName == "title").Value
                            };
            articles = feedItems.ToList();
        }

        return View(articles);
    }

    private DateTime ParseDate(string date)
    {
        DateTime result;
        if (DateTime.TryParse(date, out result))
            return result;
        else
            return DateTime.MinValue;
    }
}