翼度科技»论坛 编程开发 .net 查看内容

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

5

主题

5

帖子

15

积分

新手上路

Rank: 1

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

前言

个人博客系列已经完成了

  • 留言板
  • 文章归档
  • 推荐文章优化
  • 推荐文章排序
博客地址:https://pljzy.top
然后博客开源的原作者也是百忙之中添加了一个名为RSS订阅的功能,那么我就来简述一下这个功能是干嘛的,然后照葫芦画瓢实现一下。
RSS简述

来自chatGPT的回答
网站的RSS订阅是一种用于订阅和获取网站内容更新的技术。RSS(Really Simple Syndication)是一种XML格式的文件,包含了网站的最新文章、新闻、博客、视频等内容的摘要和链接。通过订阅网站的RSS源,用户可以方便地获取最新的内容更新,而无需每次都访问网站。
使用RSS订阅可以帮助用户更有效地管理和浏览大量的网站内容。当订阅的网站有新的内容发布时,用户可以通过RSS阅读器或者其他支持RSS的应用程序自动获取更新的摘要和链接。这样,用户可以快速浏览多个网站的最新内容,选择感兴趣的文章进行阅读。
通过订阅网站的RSS源,用户可以节省时间和精力,同时也可以避免错过重要的内容更新。无论是新闻、博客、论坛还是其他类型的网站,只要提供了RSS订阅功能,用户就可以方便地订阅并获取更新的内容。
功能实现

安装依赖

Nuget包:
  1. System.ServiceModel.Syndication
复制代码
创建控制器

_dbContext用来操作数据库的,我用的是EF Core,这里就不做解释了
_conf是用来获取系统配置的,对于RSS功能实现影响不大,不做解释
  1. public class RssController : Controller
  2. {
  3.     private readonly MyDbContext _dbContext;
  4.     private readonly ConfigService _conf;
  5.     public RssController(MyDbContext dbContext,ConfigService conf)
  6.     {
  7.         _dbContext = dbContext;
  8.         _conf = conf;
  9.     }
  10.     [HttpGet]
  11.     public IActionResult Index()
  12.     {
  13.         var feedUrl = $"{_conf["host"]}/feed";
  14.         ViewBag.FeedUrl = feedUrl;
  15.         return View();
  16.     }
  17. }
复制代码
添加接口

接口内容太多,分步解释
[ResponseCache(Duration = 1200)] 设置客户端缓存1200秒
  1. [ResponseCache(Duration = 1200)]
  2. [HttpGet("feed")]
  3. public async Task<IActionResult> Feed(){
  4. }
复制代码
初始化

  • host 其实就是自己项目的url,本地跑就是https://localhost......
  • items 为集合类型的SyndicationItem对象,后续会添加多个对象
  • posts 查询出今年所有文章,并且同时查询出文章的分类
  • feed 传入的参数分别是标题、说明、网站地址、订阅ID和最后更新时间。
  1. var host = _conf["host"];
  2. var items = new List<SyndicationItem>();
  3. var posts = await _dbContext.posts.Where(a => a.CreationTime.Year == DateTime.Now.Year)
  4. .Include(a => a.Categories)
  5. .ToListAsync();
  6. var feed = new SyndicationFeed("ZY知识库", "这是一个用于分享知识和经验的平台,我会在这里分享一些我学习和工作中的经验和心得,希望能够对你有所帮助。",
  7. new Uri($"{host}"), "RSSUrl", posts.First().LastUpdateTime)
  8. {
  9. Copyright = new TextSyndicationContent($"{DateTime.Now.Year} ZY知识库")
  10. };
复制代码
添加文章
为items对象添加数据,参数为标题、HTML 格式的文章内容、地址、最后更新时间,并且每个items对象都有Categories、Authors、PublishDate、Summary这4个参数,对应category、author、published、summary
如图所示:
  1. foreach (var item in posts)
  2. {
  3.      var postUrl = Url.Action("Post", "Blog", new { id = $"{item.Id}" }, HttpContext.Request.Scheme);
  4.      items.Add(new SyndicationItem(item.Title,
  5.      item.Summary, //图文并茂看下方↓
  6.      new Uri(postUrl),item.Id,item.LastUpdateTime)
  7. {
  8.      Categories = { new SyndicationCategory(item.Categories?.Name) },
  9.      Authors = { new SyndicationPerson("1767992919@qq.com","ZY知识库",$"{_conf["host"]}") },
  10.      PublishDate = item.CreationTime,
  11.      Summary = new TextSyndicationContent(item.Summary)
  12. });
  13. }
  14. feed.Items = items;
复制代码
如果要让 RSS 阅读器显示文章的时候图文并茂,应该使用 HTML 格式的文章内容,可以把 item.Summary 换成以下代码
  1. new TextSyndicationContent(PostService.GetContentHtml(item), TextSyndicationContentKind.Html)
复制代码
生成xml
  1. var settings = new XmlWriterSettings {
  2.     Async = true,
  3.     Encoding = Encoding.UTF8,
  4.     NewLineHandling = NewLineHandling.Entitize,
  5.     NewLineOnAttributes = true,
  6.     Indent = true
  7. };
  8. using var stream = new MemoryStream();
  9. await using var xmlWriter = XmlWriter.Create(stream, settings);
  10. var rssFormatter = new Atom10FeedFormatter(feed);
  11. rssFormatter.WriteTo(xmlWriter);
  12. await xmlWriter.FlushAsync();
  13. 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 就能看到今年发布的文章了
如图:



参考资料


来源:https://www.cnblogs.com/ZYPLJ/archive/2023/06/29/17514916.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具