Правильный способ работы с 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();
}
Ответы
Ответ 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;
}
}