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

embedded/2024/9/24 10:51:13/

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

前言

个人博客系列已经完成了

  • 留言板
  • 文章归档
  • 推荐文章优化
  • 推荐文章排序

博客地址

然后博客开源的原作者也是百忙之中添加了一个名为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

如图所示:

​编辑

 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 就能看到今年发布的文章了

如图:

 


http://www.ppmy.cn/embedded/14900.html

相关文章

图像和图像处理

在探索图像处理和其他计算机视觉功能之前,在计算机程序的数据上下文中考虑图像实际是什么会非常有用。 图像是像素数组 对于计算机而言,图像是数字像素值的数组。 例如,请考虑以下数组: 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 255 255 255 0 00&…

【打工日常】解决docker对镜像pull的很慢的问题

一、docker有时候pull很慢 有时候docker去pull某些镜像的时候,会很慢,几十k的下载,如果是非常大的镜像,那基本上是不奢望能下载下来的了,因为下载往往要等待很久,甚至会出现进度条停止下载卡死的情况。 其实原因是:因为我们docker默认镜像地址是国外源的问题,而从国内访…

el-menu 有一级二级三级菜单

效果如下 菜单代码如下 <el-menu:default-active"menuDefaultActive"class"el-menu-box":text-color"menuTextColor":active-text-color"menuActiveTextColor":unique-opened"true"><!-- 一级菜单 --><tem…

Mysql 的char 和varchar的的区别

1、char 和varchar 区别 下面以utf8字符集为例&#xff0c;char和varchar的占比计算&#xff0c;如下图 valueChar(5)bytesVarchar(5)bytesVarchar(100&#xff09;bytes‘’‘ ’15‘’1‘’1‘abcd’‘abcd ’15‘abcd’13‘abcd’13abcdeabcde15abcde16abcde16 varchar使用…

Docker 哲学 - docker save | load | export | import 及实践

当我们说 "归档文件包含了容器的所有文件&#xff0c;但不包含容器的元数据和配置"&#xff0c;我们是指 docker export 命令导出的 tar 归档文件包含了容器的文件系统中的所有文件&#xff0c;包括应用程序、库、数据等。但是&#xff0c;这个归档文件不包含关于容器…

网络中其他协议

目录 DNS协议 域名简介 ICMP协议 ICMP功能 ICMP协议格式 ping命令 NAT技术 NATP NAT技术的限制 代理服务器 DNS协议 DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;协议&#xff0c;是一个用来将域名转化为IP地址的应用层协议。 为什么有这个协…

分析和比较深度学习框架 PyTorch 和 Tensorflow

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 深度学习作为人工智能的一个重要分支&#xff0c;在过去十年中取得了显著的进展。PyTorch 和 TensorFlow 是目前最受欢迎、最强大的两个深度学习框架&#xff0c;它们各自拥有独特的特点和优势。 1. Py…

Python——目标检测标签中的英文名转化为对应的类别编号

Yolov5进行目标检测流程在下文中已做说明&#xff1a; Python——一文详解使用yolov5进行目标检测全流程&#xff08;无需gpu&#xff09;_yolo不用gpu-CSDN博客 在Yolov5使用中中&#xff0c;标签数据里类别的中文名&#xff0c;需要转换成类别编号。相关代码如下&#x…