在 ASP.NET Core 1.0 RC2 中使用 RSS 的正确方法
Right way to work with RSS in ASP.NET Core 1.0 RC2
在 C# 中使用 ASP.Net Core 1.0 (RC2) 从 RSS 提要获取数据的 right/best 方法是什么。
我想使用来自我的 Wordpress 博客的 RSS 提要中的数据,即 https://blogs.msdn.microsoft.com/martinkearn/feed/
我知道在 ASP.net 4.x 中,您会使用 RssReader
或 SyndicationFeed
,但我找不到 ASP.net 核心的等效项。
据我所知,这是 returns 原始提要,但我不知道如何从中提取数据。我想枚举项目并从每个
中获取 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();
}
根据 this issue,System.ServiceModel.Syndication 尚未移植到 ASP.NET 核心。目前,这给您留下了 2 个选择:
- 以完整的 .NET 框架为目标,以提供对
SyndicationFeed
的访问
- 使用 .NET Core 构建您自己的 XML 解析器以重现您需要的功能
以完整的 .NET 框架为目标
根据您的要求,这无疑是最简单的方法。
如果您要部署到 windows,那么您可以 运行 ASP.NET .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/
为了完整起见,我将在答案的 'Build your own XML Parser' 部分包含最终代码,它是链接到示例 @Sock 的精简版本。 @Sock 的答案仍然是最完整的答案,但是这个示例对于正在寻找 ASP.NET Core.
的快速、简单代码示例的任何人来说应该很有用。
型号
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;
}
}
在 C# 中使用 ASP.Net Core 1.0 (RC2) 从 RSS 提要获取数据的 right/best 方法是什么。
我想使用来自我的 Wordpress 博客的 RSS 提要中的数据,即 https://blogs.msdn.microsoft.com/martinkearn/feed/
我知道在 ASP.net 4.x 中,您会使用 RssReader
或 SyndicationFeed
,但我找不到 ASP.net 核心的等效项。
据我所知,这是 returns 原始提要,但我不知道如何从中提取数据。我想枚举项目并从每个
中获取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();
}
根据 this issue,System.ServiceModel.Syndication 尚未移植到 ASP.NET 核心。目前,这给您留下了 2 个选择:
- 以完整的 .NET 框架为目标,以提供对
SyndicationFeed
的访问
- 使用 .NET Core 构建您自己的 XML 解析器以重现您需要的功能
以完整的 .NET 框架为目标
根据您的要求,这无疑是最简单的方法。
如果您要部署到 windows,那么您可以 运行 ASP.NET .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/
为了完整起见,我将在答案的 'Build your own XML Parser' 部分包含最终代码,它是链接到示例 @Sock 的精简版本。 @Sock 的答案仍然是最完整的答案,但是这个示例对于正在寻找 ASP.NET Core.
的快速、简单代码示例的任何人来说应该很有用。型号
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;
}
}