基于.NetCore开发博客项目 StarBlog - (29) 开发RSS订阅功能

基于,netcore,开发,博客,项目,starblog,rss订阅,功能 · 浏览次数 : 652

小编点评

## Summary of the article: This article explains how to implement RSS feed functionality in a ASP.NET Core web application using C#. **Key points:** * RSS is a protocol that allows users to subscribe to content from a website and receive updates about new articles. * There are two main types of RSS feeds: Atom and RSS2.0. * Atom is a simpler and more efficient protocol that is compatible with older browsers. * RSS2.0 is a more advanced protocol that is more efficient and can handle complex content. * The article provides step-by-step instructions on how to implement an RSS feed using both Atom and RSS2.0 protocols. * The code is well-commented and easy to understand. * The article also provides links to resources for further learning. **Overall, the article provides a clear and concise guide on how to implement an RSS feed in an ASP.NET Core application.**

正文

前言

最近忙中偷闲把博客的评论功能给做完了,我可以说这个评论功能已经达到「精致」的程度了😃

但在正式发布之前,先卖个关子,来介绍一下另一个新功能——RSS订阅🔊

RSS是啥

来自hk gov新闻网的介绍~

RSS 是簡易資訊聚合(Really Simple Syndication) 的簡稱,RSS採用一個 XML 的檔案格式,只要你把RSS內容的網址,加到你的RSS閱讀軟件 (RSS Reader),每當該網頁內容更新時,更新了的摘要便會自動加到你的閱讀軟件之內,通知你有關內容。透過 RSS 的使用,供應網頁內容的人可以很容易地產生並傳播新聞鏈結、標題和摘要等資料。

一个网站支持 RSS,就意味着每当它新发布一篇新文章,就会往一个位于特定网址的文件中,以特定的语法(具体而言是 XML 标记语言或 JSON)增加一条记录,列明这篇文章的标题、作者、发表时间和内容(可以是全文,也可以是摘要)等信息。这样,用户只要搜集所有他感兴趣的网站提供的这种文件的网址,并不时检查这些文件内容的更新,就能知道这些网站是否、何时发布了什么内容。RSS 阅读器的核心功能,就是存储用户订阅的 RSS 地址,以固定的频率自动检查更新,并将其内容转换为易读的格式呈现给用户。

为啥要开发RSS功能

起先是有用户在StarBlog项目github里提了个issue

我觉得挺不错的,实现起来也不难,所以就着手安排实现了。

对于现在的网友来说,这算是个比较陌生和小众的东西,RSS 的对立面是算法推荐,像微信公众号、知乎、微博、今日头条等平台。 且不说算法推送平台广告多,迁移麻烦的问题。算法推荐的特点是,你不需要刻意选择,算法会根据你的喜好,给你推送内容。这样一来,你几乎没有选择的余地,在不断被「喂饱」中逐渐失去判断的能力。更可怕的地方在于,它替你定义了你的画像,然后把你潜移默化中变成了它所认为的你。「大数据杀熟」的东窗事发绝非偶然,用算法窥视用户隐私是当今互联网公司的通配。

做信息的主人,而不是奴隶。RSS 是一种公开的协议,可自由更换平台与客户端。重要的一点是,获取信息的权力完全自治。RSS 相比算法推荐,拥有了可控性和安全感,隐私完全掌握在自己手里。

RSS版本 - Atom 与 RSS2.0

我一开始以为 RSS2.0 比 Atom1.0 更新,结果完全搞反了~

简单来说:ATOM是RSS2.0的改进方案,因为RSS2.0的标准已经冻结,所以才出了ATOM。主要改进是ATOM可以通过标签识别一个内容是否是全文输出而RSS2.0不可以。

同时,ATOM不仅能够判断出内容是否是全文输出,在终端软件使用该FEED时,还可以从中得到那一部分是“摘要”那一部分是“全文”方便进行区别显示。

那肯定选新版的啦,直接用 Atom1.0 版本。

实现

一开始我是打算找个第三方库,可以直接和AspNetCore很好地结合在一起的那种。

不过没有找到,但是我发现 C# 标准库居然有提供对 RSS 的支持~ 那还要啥自行车,立刻安排!🆗

安装依赖

虽然是「标准库」但因为现在 .net core 是很轻的,所以还是需要手动添加个 nuget 包才可以用。

dotnet add package System.ServiceModel.Syndication

这个 Syndication 库可以很方便的创建 RSS 订阅。

下面分步骤实现

添加接口

添加 StarBlog.Web/Controllers/RssController.cs 文件

[ApiController]
[Route("feed")]
[ApiExplorerSettings(IgnoreApi = true)]
public class RssController : ControllerBase {
  private readonly IBaseRepository<Post> _postRepo;

  public RssController(IBaseRepository<Post> postRepo) {
    _postRepo = postRepo;
  }

  [ResponseCache(Duration = 1200)]
  [HttpGet]
  public async Task<IActionResult> Index() {
  }
}

接着在 Index 方法里面写代码

创建 feed

var feed = new SyndicationFeed("StarBlog", "程序设计实验室,一个技术探索与知识分享的平台", new Uri("http://blog.deali.cn"), "RSSUrl", DateTime.Now) {
  Copyright = new TextSyndicationContent($"{DateTime.Now.Year} DealiAxy")
};

传入的参数分别是标题、说明、网站地址、订阅ID和最后更新时间。

这里只是例子,所以把更新时间直接写成当前时间了,实际上应该把最新文章的时间写进去。

添加文章

把博客的文章添加到订阅源里

var items = new List<SyndicationItem>();
var posts = await _postRepo.Where(a => a.IsPublish && a.CreationTime.Year == DateTime.Now.Year)
  .Include(a => a.Category)
  .ToListAsync();
foreach (var item in posts) {
  var postUrl = Url.Action("Post", "Blog", new { id = item.Id }, HttpContext.Request.Scheme);
  items.Add(new SyndicationItem(item.Title, item.Summary, new Uri(postUrl), item.Id, item.LastUpdateTime) {
    Categories = { new SyndicationCategory(item.Category?.Name) },
    Authors = { new SyndicationPerson("admin@deali.cn", "DealiAxy", "https://deali.cn") },
    PublishDate = item.CreationTime
  });
}
feed.Items = items;

这里我把今年已发布的文章都放进订阅源里。

RSS文章内容通过 SyndicationItem 构造方法的第二个参数传入,为了实例代码简洁,我直接偷懒使用纯文本的 summary

如果要让 RSS 阅读器显示文章的时候图文并茂,应该使用 HTML 格式的文章内容,可以把 item.Summary 换成以下代码

new TextSyndicationContent(PostService.GetContentHtml(item), TextSyndicationContentKind.Html)

生成xml

最后,因为 RSS 是使用 XML 格式的,所以最后需要使这个接口返回 XML 数据。

var settings = new XmlWriterSettings {
  Async = true,
  Encoding = Encoding.UTF8,
  NewLineHandling = NewLineHandling.Entitize,
  NewLineOnAttributes = true,
  Indent = true
};
using var stream = new MemoryStream();
await using var xmlWriter = XmlWriter.Create(stream, settings);
var rssFormatter = new Atom10FeedFormatter(feed);
rssFormatter.WriteTo(xmlWriter);
await xmlWriter.FlushAsync();

return File(stream.ToArray(), "application/rss+xml; charset=utf-8");

注意 var rssFormatter = new Rss20FeedFormatter(feed, false); 这行代码,表示我们用的 RSS 版本是 Atom1.0。

如果要用 RSS2.0 ,可以换成以下代码,第二个参数设置为 false 代表不把扩展语法渲染成 Atom 1.0 的样式。

var rssFormatter = new Rss20FeedFormatter(feed, false);

完整代码

完整代码见 github ~

https://github.com/Deali-Axy/StarBlog/blob/dev/StarBlog.Web/Controllers/RssController.cs

最终效果

RSS 订阅需要使用客户端阅读

这里我使用了一个开源的Windows客户端 Fluent Reader

blog.deali.cn/feed 添加到订阅源之后,就可以看到今年发布的文章了

搞定,收工~

参考资料

与基于.NetCore开发博客项目 StarBlog - (29) 开发RSS订阅功能相似的内容:

基于.NetCore开发博客项目 StarBlog - (29) 开发RSS订阅功能

## 前言 最近忙中偷闲把博客的评论功能给做完了,我可以说这个评论功能已经达到「精致」的程度了😃 但在正式发布之前,先卖个关子,来介绍一下另一个新功能——RSS订阅🔊 ## RSS是啥 来自hk gov新闻网的介绍~ > RSS 是簡易資訊聚合(Really Simple Syndication

基于.NetCore开发博客项目 StarBlog - (19) Markdown渲染方案探索

## 前言 笔者认为,一个博客网站,最核心的是阅读体验。 在开发StarBlog的过程中,最耗时的恰恰也是文章的展示部分功能。 最开始还没研究出来如何很好的使用后端渲染,所以只能先用Editor.md组件做前端渲染,过渡一下。前端渲染我是不满意的,因为性能较差,页面加载出来还会闪一下,有割裂感,影响

基于.NetCore开发博客项目 StarBlog - (20) 图片显示优化

## 前言 我的服务器带宽比较高,博客部署在上面访问的时候几乎没感觉有加载延迟,就没做图片这块的优化,不过最近有小伙伴说博客的图片加载比较慢,那就来把图片优化完善一下吧~ 目前有两个地方需要完善 - 图片瀑布流 - 图片缩略图 ## 图片瀑布流 关于瀑布流之前的文章有介绍: [基于.NetCore开

基于.NetCore开发博客项目 StarBlog - (21) 开始开发RESTFul接口

## 前言 最近电脑坏了,开源项目的进度也受到一些影响 这篇酝酿很久了,作为本系列第二部分(API接口开发)的第一篇,得想一个好的开头,想着想着就鸽了好久,索性不扯那么多了,直接开写吧~ ## 关于RESTFul 网上很多相关的文章都要把RESTFul历史来龙去脉给复制一遍,所以我这就不重复了,现在

基于.NetCore开发博客项目 StarBlog - (22) 开发博客文章相关接口

## 前言 本文介绍博客文章相关接口的开发,作为接口开发介绍的第一篇,会写得比较详细,以抛砖引玉,后面的其他接口就粗略带过了,着重于WebApi开发的周边设施。 涉及到的接口:文章CRUD、置顶文章、推荐文章等。 开始前先介绍下AspNetCore框架的基础概念,MVC模式(前后端不分离)、WebA

基于.NetCore开发博客项目 StarBlog - (23) 文章列表接口分页、过滤、搜索、排序

## 前言 上一篇留的坑,火速补上。 在之前的第6篇中,已经有初步介绍,本文做一些补充,已经搞定这部分的同学可以快速跳过,[基于.NetCore开发博客项目 StarBlog - (6) 页面开发之博客文章列表](https://www.cnblogs.com/deali/p/16286780.ht

基于.NetCore开发博客项目 StarBlog - (24) 统一接口数据返回格式

## 前言 开发接口,是给客户端(Web前端、App)用的,前面说的RESTFul,是接口的规范,有了统一的接口风格,客户端开发人员在访问后端功能的时候能更快找到需要的接口,能写出可维护性更高的代码。 而接口的数据返回格式也是接口规范的重要一环,不然一个接口返回JSON,一个返回纯字符串,客户端对接

基于.NetCore开发博客项目 StarBlog - (25) 图片接口与文件上传

## 前言 上传文件的接口设计有两种风格,一种是整个项目只设置一个接口用来上传,然后其他需要用到文件的地方,都只存一个引用ID;另一种是每个需要文件的地方单独管理各自的文件。这俩各有优劣吧,本项目中选择的是后者的风格,文章图片和照片模块又要能CRUD又要批量导入,还是各自管理文件比较好。 ## 图片

基于.NetCore开发博客项目 StarBlog - (26) 集成Swagger接口文档

## 前言 这是StarBlog系列在2023年的第一篇更新😃~ 在之前的文章里,我们已经完成了部分接口的开发,接下来需要使用 curl、Postman 这类工具对这些接口进行测试,但接口一多,每次测试都要一个个填入地址和对应参数会比较麻烦… 我们需要一种直观的方式来汇总项目里的所有接口,并且如果

基于.NetCore开发博客项目 StarBlog - (27) 使用JWT保护接口

## 前言 这是StarBlog系列在2023年的第二篇更新😂 这几个月都在忙,更新变得很不勤快,但是拖着不更新我的心里更慌,很久没写,要开头就变得很难😑 说回正题,之前的文章里,我们已经把博客关键的接口都开发完成了,但还少了一个最关键的「认证授权」,少了这东西,网站就跟筛子一样,谁都可以来添加