首页 > 其他分享 >.NET 个人博客-添加RSS订阅功能

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

时间:2023-06-29 18:11:05浏览次数:47  
标签:RSS订阅 博客 item conf var new 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("[email protected]","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

参考资料

标签:RSS订阅,博客,item,conf,var,new,NET,RSS
From: https://www.cnblogs.com/ZYPLJ/p/17514916.html

相关文章

  • Kubernetes编程——client-go基础—— 深入 API Machinery —— Kind
    深入APIMachinery——Kind 在Kubernetes中,APIMachinery是一个核心的软件库,用于构建Kubernetes的API服务器和控制器。它提供了一些基本的功能,如对象存储、认证鉴权、API请求处理和验证等。 在APIMachinery中,Kind是一个重要的概念。在Kubernetes中,每个资源......
  • 【.NET源码解读】深入剖析中间件的设计与实现
    .NET本身就是一个基于中间件(middleware)的框架,它通过一系列的中间件组件来处理HTTP请求和响应。在之前的文章《.NET源码解读kestrel服务器及创建HttpContext对象流程》中,已经通过源码介绍了如何将HTTP数据包转换为.NET的HttpContext对象。接下来,让我们深入了解一下.NET是如何设计中......
  • 博客园:使Mathjax支持TEX公式输入
    解决办法打开博客管理后台,打开“设置”,找到“页首HTML代码”选项,添加以下代码即可:参考文章[1]博客园中使用MathJax......
  • Kubernetes编程——client-go基础—— 工作队列(workqueue)
    工作队列(workqueue[wɜːk][kjuː])https://github.com/kubernetes/kubernetes/tree/release-1.27/staging/src/k8s.io/client-go/util/workqueue我理解意思是说:这里说的"工作队列"指的一个数据结构。用户可以按照队列所预定义的顺序向这个队列中添加和取出......
  • NET6的net6.0-windows10.xxx文件夹
    通常使用.NET6生成window程序默认在bin下会生成对应系统的net6.0-windows10.xxxx之类的文件夹。如果不喜欢的可以在项目文件中编辑增加<PropertyGroup><AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath></PropertyGroup> ......
  • Centos 安装 netcore2.2 sdk
    netcore2.2sdk安装注意事项:鉴于服务器不能连接外网,只能通过现将安装包下载到本地电脑,再通过xftp工具上传官方下载页面:Download.NETCore2.2(Linux,macOS,andWindows)(microsoft.com) 通过xftp工具传到/home/data/backup目录下创建加压目录:mkdir......
  • windows环境下使用Jenkins部署.net core
    前言之前学习了windows环境下使用Jenkins配置dotnetcore极简入门-chenxizhaolu-博客园(cnblogs.com)又学习了Windows下使用docker部署.NetCore-chenxizhaolu-博客园(cnblogs.com)现在将两者结合起来,通过Jenkins自动发布.netcore到Docker1、安装Jenkins参照windo......
  • Asp.net OAuth2.0 跨域设置(可指定域名)
    第一步:Startup添加如下代码 第二步:功能实现///<summary>///跨域配置///</summary>publicclassCorsOriginsConfig{///<summary>///设置///</summary>publicstaticvoidSet(IAppBuilderapp)......
  • Kubernetes(k8s) Web-UI界面(一):部署和访问仪表板(Dashboard)
    目录一.系统环境二.前言三.仪表板(Dashboard)简介四.部署Kubernetes仪表板(Dashboard)五.访问Kubernetes仪表板(Dashboard)5.1使用token登录Dashboard5.2对sa账号kubernetes-dashboard授权5.3访问Dashboard六.总结七.附加信息一.系统环境本文主要基于Kubernetes1.21.9和Linux操作......
  • Netty
    Netty是一个高性能、异步事件驱动的NIO框架,基于JavaNIO提供的API实现。它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制获取IO操作结果。Netty高性能在IO编程过程中,当需......