<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Loading

      基于.NetCore開發博客項目 StarBlog - (29) 開發RSS訂閱功能

      前言

      最近忙中偷閑把博客的評論功能給做完了,我可以說這個評論功能已經達到「精致」的程度了??

      但在正式發布之前,先賣個關子,來介紹一下另一個新功能——RSS訂閱??

      RSS是啥

      來自hk gov新聞網的介紹~

      RSS 是簡易資訊聚合(Really Simple Syndication) 的簡稱,RSS採用一個 XML 的檔案格式,只要你把RSS內容的網址,加到你的RSS閱讀軟件 (RSS Reader),每當該網頁內容更新時,更新了的摘要便會自動加到你的閱讀軟件之內,通知你有關內容。透過 RSS 的使用,供應網頁內容的人可以很容易地產生並傳播新聞鏈結、標題和摘要等資料。

      一個網站支持 RSS,就意味著每當它新發布一篇新文章,就會往一個位于特定網址的文件中,以特定的語法(具體而言是 XML 標記語言或 JSON)增加一條記錄,列明這篇文章的標題、作者、發表時間和內容(可以是全文,也可以是摘要)等信息。這樣,用戶只要搜集所有他感興趣的網站提供的這種文件的網址,并不時檢查這些文件內容的更新,就能知道這些網站是否、何時發布了什么內容。RSS 閱讀器的核心功能,就是存儲用戶訂閱的 RSS 地址,以固定的頻率自動檢查更新,并將其內容轉換為易讀的格式呈現給用戶。

      為啥要開發RSS功能

      起先是有用戶在StarBlog項目github里提了個issue

      我覺得挺不錯的,實現起來也不難,所以就著手安排實現了。

      對于現在的網友來說,這算是個比較陌生和小眾的東西,RSS 的對立面是算法推薦,像微信公眾號、知乎、微博、今日頭條等平臺。 且不說算法推送平臺廣告多,遷移麻煩的問題。算法推薦的特點是,你不需要刻意選擇,算法會根據你的喜好,給你推送內容。這樣一來,你幾乎沒有選擇的余地,在不斷被「喂飽」中逐漸失去判斷的能力。更可怕的地方在于,它替你定義了你的畫像,然后把你潛移默化中變成了它所認為的你。「大數據殺熟」的東窗事發絕非偶然,用算法窺視用戶隱私是當今互聯網公司的通配。

      做信息的主人,而不是奴隸。RSS 是一種公開的協議,可自由更換平臺與客戶端。重要的一點是,獲取信息的權力完全自治。RSS 相比算法推薦,擁有了可控性和安全感,隱私完全掌握在自己手里。

      RSS版本 - Atom 與 RSS2.0

      我一開始以為 RSS2.0 比 Atom1.0 更新,結果完全搞反了~

      簡單來說:ATOM是RSS2.0的改進方案,因為RSS2.0的標準已經凍結,所以才出了ATOM。主要改進是ATOM可以通過標簽識別一個內容是否是全文輸出而RSS2.0不可以。

      同時,ATOM不僅能夠判斷出內容是否是全文輸出,在終端軟件使用該FEED時,還可以從中得到那一部分是“摘要”那一部分是“全文”方便進行區別顯示。

      那肯定選新版的啦,直接用 Atom1.0 版本。

      實現

      一開始我是打算找個第三方庫,可以直接和AspNetCore很好地結合在一起的那種。

      不過沒有找到,但是我發現 C# 標準庫居然有提供對 RSS 的支持~ 那還要啥自行車,立刻安排!??

      安裝依賴

      雖然是「標準庫」但因為現在 .net core 是很輕的,所以還是需要手動添加個 nuget 包才可以用。

      dotnet add package System.ServiceModel.Syndication
      

      這個 Syndication 庫可以很方便的創建 RSS 訂閱。

      下面分步驟實現

      添加接口

      添加 StarBlog.Web/Controllers/RssController.cs 文件

      [ApiController]
      [Route("feed")]
      [ApiExplorerSettings(IgnoreApi = true)]
      public class RssController : ControllerBase {
        private readonly IBaseRepository<Post> _postRepo;
      
        public RssController(IBaseRepository<Post> postRepo) {
          _postRepo = postRepo;
        }
      
        [ResponseCache(Duration = 1200)]
        [HttpGet]
        public async Task<IActionResult> Index() {
        }
      }
      

      接著在 Index 方法里面寫代碼

      創建 feed

      var feed = new SyndicationFeed("StarBlog", "程序設計實驗室,一個技術探索與知識分享的平臺", new Uri("http://blog.deali.cn"), "RSSUrl", DateTime.Now) {
        Copyright = new TextSyndicationContent($"{DateTime.Now.Year} DealiAxy")
      };
      

      傳入的參數分別是標題、說明、網站地址、訂閱ID和最后更新時間。

      這里只是例子,所以把更新時間直接寫成當前時間了,實際上應該把最新文章的時間寫進去。

      添加文章

      把博客的文章添加到訂閱源里

      var items = new List<SyndicationItem>();
      var posts = await _postRepo.Where(a => a.IsPublish && a.CreationTime.Year == DateTime.Now.Year)
        .Include(a => a.Category)
        .ToListAsync();
      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.Category?.Name) },
          Authors = { new SyndicationPerson("admin@deali.cn", "DealiAxy", "https://deali.cn") },
          PublishDate = item.CreationTime
        });
      }
      feed.Items = items;
      

      這里我把今年已發布的文章都放進訂閱源里。

      RSS文章內容通過 SyndicationItem 構造方法的第二個參數傳入,為了實例代碼簡潔,我直接偷懶使用純文本的 summary

      如果要讓 RSS 閱讀器顯示文章的時候圖文并茂,應該使用 HTML 格式的文章內容,可以把 item.Summary 換成以下代碼

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

      生成xml

      最后,因為 RSS 是使用 XML 格式的,所以最后需要使這個接口返回 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/rss+xml; charset=utf-8");
      

      注意 var rssFormatter = new Rss20FeedFormatter(feed, false); 這行代碼,表示我們用的 RSS 版本是 Atom1.0。

      如果要用 RSS2.0 ,可以換成以下代碼,第二個參數設置為 false 代表不把擴展語法渲染成 Atom 1.0 的樣式。

      var rssFormatter = new Rss20FeedFormatter(feed, false);
      

      完整代碼

      完整代碼見 github ~

      https://github.com/Deali-Axy/StarBlog/blob/dev/StarBlog.Web/Controllers/RssController.cs

      最終效果

      RSS 訂閱需要使用客戶端閱讀

      這里我使用了一個開源的Windows客戶端 Fluent Reader

      blog.deali.cn/feed 添加到訂閱源之后,就可以看到今年發布的文章了

      搞定,收工~

      參考資料

      posted @ 2023-06-24 21:12  程序設計實驗室  閱讀(968)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国内视频偷拍一区,二区,三区| 无码天堂va亚洲va在线va| 淅川县| www国产成人免费观看视频| 91亚洲国产成人久久精品| 日本边吃奶边摸边做在线视频| 最新国产精品中文字幕| 妺妺窝人体色www聚色窝仙踪| 精品国产AV最大网站| 美乳丰满人妻无码视频| 亚洲综合色网一区二区三区| 日韩精品中文字幕人妻| 伊人精品成人久久综合97| 国产无吗一区二区三区在线欢| 夜夜添狠狠添高潮出水| 欧美日韩在线亚洲二区综二| 亚日韩精品一区二区三区| 邻居少妇张开腿让我爽了一夜| 国产精品亚洲二区在线播放| 乱人伦中文视频在线| 鹤壁市| 国产午夜福利一区二区三区| 国产三级精品三级在线区| 国产一区国产精品自拍| 久久99精品久久久久久齐齐| 成人免费无遮挡在线播放| 亚洲一区二区三区在线| 色婷婷亚洲精品综合影院| 人妻中文字幕精品系列| 日韩精品国产中文字幕| 性色av无码久久一区二区三区| 国产小受被做到哭咬床单GV| 国产爆乳无码视频在线观看3| 伊人久久大香线蕉网av| 中文字幕亚洲综合第一页| 少妇无码av无码一区| 国产免费一区二区不卡| 国产精品无码无卡在线播放| 久久99精品中文字幕在| 97久久超碰精品视觉盛宴| 日韩av无码中文无码电影|