# 個人博客-添加RSS訂閱功能 # 前言 個人博客系列已經完成了 - [x] 留言板 - [x] 文章歸檔 - [x] 推薦文章優化 - [x] 推薦文章排序 博客地址:https://pljzy.top 然後博客開源的原作者也是百忙之中添加了一個名為**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對象都有Categories
、Authors
、PublishDate
、Summary
這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("[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 就能看到今年發佈的文章了
如圖:
參考資料
- https://blog.sblt.deali.cn:9000/Blog/Post/adcd547eefd06863
- 基於.NetCore開發博客項目 StarBlog - (29) 開發RSS訂閱功能 - 程式設計實驗室 - 博客園 (cnblogs.com)