.NET 个人博客-添加RSS订阅功能

个人博客-添加RSS订阅功能

前言

个人博客系列已经完成了

博客地址:https://pljzy.top

然后博客开源的原作者也是百忙之中添加了一个名为RSS订阅的功能,那么我就来简述一下这个功能是干嘛的,然后照葫芦画瓢实现一下。

RSS简述

来自chatGPT的回答

网站的RSS订阅是一种用于订阅和获取网站内容更新的技术。RSS(Really Simple Syndication)是一种XML格式的文件,包含了网站的最新文章、新闻、博客、视频等内容的摘要和链接。通过订阅网站的RSS源,用户可以方便地获取最新的内容更新,而无需每次都访问网站。

使用RSS订阅可以帮助用户更有效地管理和浏览大量的网站内容。当订阅的网站有新的内容发布时,用户可以通过RSS阅读器或者其他支持RSS的应用程序自动获取更新的摘要和链接。这样,用户可以快速浏览多个网站的最新内容,选择感兴趣的文章进行阅读。

通过订阅网站的RSS源,用户可以节省时间和精力,同时也可以避免错过重要的内容更新。无论是新闻、博客、论坛还是其他类型的网站,只要提供了RSS订阅功能,用户就可以方便地订阅并获取更新的内容。

功能实现

安装依赖

Nuget包:

System.ServiceModel.Syndication

创建控制器

_dbContext用来操作数据库的,我用的是EF Core,这里就不做解释了

_conf是用来获取系统配置的,对于RSS功能实现影响不大,不做解释

public class RssController : Controller
{
    private readonly MyDbContext _dbContext;
    private readonly ConfigService _conf;

    public RssController(MyDbContext dbContext,ConfigService conf)
    {
        _dbContext = dbContext;
        _conf = conf;
    }

    [HttpGet]
    public IActionResult Index()
    {
        var feedUrl = $"{_conf["host"]}/feed";
        ViewBag.FeedUrl = feedUrl;
        return View();
    }
}

添加接口

接口内容太多,分步解释

[ResponseCache(Duration = 1200)] 设置客户端缓存1200秒

 [ResponseCache(Duration = 1200)]
 [HttpGet("feed")]
 public async Task<IActionResult> Feed(){

}

初始化

  • host 其实就是自己项目的url,本地跑就是https://localhost......
  • items 为集合类型的SyndicationItem对象,后续会添加多个对象
  • posts 查询出今年所有文章,并且同时查询出文章的分类
  • feed 传入的参数分别是标题、说明、网站地址、订阅ID和最后更新时间。
var host = _conf["host"];
var items = new List<SyndicationItem>();
var posts = await _dbContext.posts.Where(a => a.CreationTime.Year == DateTime.Now.Year)
.Include(a => a.Categories)
.ToListAsync();
var feed = new SyndicationFeed("ZY知识库", "这是一个用于分享知识和经验的平台,我会在这里分享一些我学习和工作中的经验和心得,希望能够对你有所帮助。",
new Uri($"{host}"), "RSSUrl", posts.First().LastUpdateTime)
{
Copyright = new TextSyndicationContent($"{DateTime.Now.Year} ZY知识库")
};

添加文章

为items对象添加数据,参数为标题、HTML 格式的文章内容、地址、最后更新时间,并且每个items对象都有CategoriesAuthorsPublishDateSummary这4个参数,对应category、author、published、summary

如图所示:

image

 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.Categories?.Name) },
     Authors = { new SyndicationPerson("1767992919@qq.com","ZY知识库",$"{_conf["host"]}") },
     PublishDate = item.CreationTime,
     Summary = new TextSyndicationContent(item.Summary)
 });
 }

feed.Items = items;

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

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

生成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/xml; charset=utf-8");

功能预览

RSS本身是一种XML格式的文本内容,要查看该内容需要用到专门的RSS客户端,原作者推荐的是开源的Windows客户端 Fluent Reader。

那么他的下载地址为:Releases · yang991178/fluent-reader (github.com)

然后只需要添加预览源:https://pljzy.top/feed 就能看到今年发布的文章了

如图:

image

image

image

参考资料

posted @   妙妙屋(zy)  阅读(242)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· DeepSeek “源神”启动!「GitHub 热点速览」
· 上周热点回顾(2.17-2.23)
  1. 1 够爱(翻自 曾沛慈) 是我呀卡司宝贝
  2. 2 老人と海 ヨルシカ
  3. 3 生生世世爱 黄霄雲
  4. 4 希望有羽毛和翅膀 imzat
生生世世爱 - 黄霄雲
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 杨漩予

作曲 : 林毅

爱 还没来

天地间风云忽然变

有情有义的人都要回来

爱 总会来

生死注定的来世再爱

都等了太久哭尽无奈

rap

是谁站在三清山门外

回首看桃溪花正开

一入岁月江湖中来

再随之去追星辰山海

到底是那恩怨过往

或是爱恨情长 怎么收场

这些年的故事和秘密

都在逆水寒里珍藏

爱恨纠缠的生生世世

爱恨纠缠的生生世世

心底执着的信念为你存在

多遥远的路都阻挡不住

再次拥有没距离的温度

失去自由的生生世世

有爱不懂相拥错过了最爱

送一剑祝福再默默相助

恐怕没以后不自觉留退路

爱 还没来

爱 还没来

天地间风云忽然变

有情有义的人都要回来

爱 总会来

生死注定的来世再爱

都等了太久哭尽无奈

rap

遇过金风细雨楼的刀太快

也遇过六分半堂惊雷开

身处这江湖风雨事

却不知可曾有故人来

轻挥一剑千山过

再回望轻舟多澎湃

我欲乘风逍遥去

纵览天地入我怀

从此我心自在

爱恨纠缠的生生世世

爱恨纠缠的生生世世

心底执着的信念为你存在

多遥远的路都阻挡不住

再次拥有没距离的温度

失去自由的生生世世

有爱不懂相拥错过了最爱

送一剑祝福再默默相助

恐怕没以后不自觉留退路

为情所困的生生世世

为情所困的生生世世

伤也被伤命中成双的伤害

等不到日出一个人孤独

让星光代替我伴你远途

黑白轮回的生生世世

彻底放开成全永远的依赖

是乱世英雄或凡间俗梦

爱不离爱是把这感动留住

爱不离爱是把这感动留住

原唱 : 吴雨霏

OP原始版权人:北京大石音乐版权有限公司、CHANCES CREATIVE MUSIC LTD

SP代理权利人:北京大石音乐版权有限公司、百代音乐版权代理(北京)有限公司

编曲改编:1AN孙毅然

改编词(Rap词):焦糖

Rapper:阿茹汗

笛子实录:水玥儿

混音&母带工程师:王嘉屏

和声:曾雪祁

配唱制作人:沈小力

录音师:邢铜

录音棚:55TEC Studio

出品:逆水寒

企划营销:微梦传媒

点击右上角即可分享
微信分享提示